2012-10-12 2 views
1

다른 사람이 더 좋은 제목을 제안 할 수 있습니까?컴파일러가 primairy 유형을 클래스로 가정하도록 하시겠습니까?

나는 질문이 있지만 올바른 영어로 쓰는 방법을 모르겠다.

내가 구조체 더블라는 이름의 한 가정 : 그래서 몇 가지 예에 의하여이를 요청할 것

struct Double 
{ 
    // Declarations/Definitions here 
} 

을 그리고 그것은 두 배 primairy 유형으로 사용됩니다. 내 클래스를 제외하고 거의 똑같은 클래스가 있습니다.

void Double::event_serialize(Stream& stream); 
String Double::event_representate(); 

그래서이 유형 (및 기타)에 대한 래퍼를 만들어야했습니다.

template<class T> void print(T value) 
{ 
    std::cout << value.event_representate() << std::endl; 
} 

이 지금은 같은 조합으로 사용할 수 있습니다 :

는 지금은 예를 들어 이런 기능이

:

Double x = 3.14; 
print(x); 

하지만을 나는로 사용하려는 경우

print(3.14); 

컴파일러는 다음과 같이 동작합니다 :

const double __invis_value_1 = 3.14; 

print(__invis_value_1); 

오른쪽?

컴파일러가 primairy 유형 double 대신 Double로 감지 할 수 있는지 (가능한 경우) 어떻게 확인할 수 있습니까?

누군가가 나를 도울 수 있기를 바랍니다. 미리 감사드립니다!

+0

재미 있을지 모르지만 흥미 롭습니다. 적절한 연산자를 가지고 있다면 캐스팅 할 수 있습니다 : print ((Double) 3.14); – mark

+1

무료 함수로 만들면 사용자가 아닌 데이터 유형을 확장하는 적절한 방법입니다. – Xeo

+0

어떻게하면됩니까? 의견을 주셔서 감사합니다. – Tim

답변

0

매개 변수를 double로 취하는 Double의 생성자를 만들면 3.14 예제에서 암시 적으로 double로 형변환됩니다. 심지어 기본값을 지정할 수도 있습니다.

struct Double 
{ 
    // Declarations/Definitions here 
    Double(double value = 0.0); 
} 
+0

'print'는 템플릿이기 때문에 그럴 수 없습니다. – Xeo

+0

명시 적으로 캐스팅 할 수는 있지만 작동하지만 암묵적으로는 알 수 없습니다. – mark

+0

사실, Double 클래스가 완성되었습니다. 하지만 문제는 컴파일러가 "3.14"가 Double 대신 Double 유형으로 간주하고 Double :: Double (double value) 생성자가 호출되지 않는 것으로 가정하는 방법입니다. – Tim

2

당신은 변환 print의 과부하를 제공 할 수 doubleDouble에 :

void print(double value) { 
    print<Double>(Double(value)); 
} 

당신이 사용자 정의 리터럴 사용하는 것입니다 고려해 볼 수 있습니다 대안 :

inline constexpr Double operator"" _D(long double value) { 
    return Double(value); 
} 

당신은 수를 다음을 작성하십시오 :

print(3.14_D); 
+0

'print (value)'또는'print (Double (value))'를 사용하십시오. :) – Xeo

+0

나는 생각했다. 그러나 중요한 것은 인쇄는 단지 예일뿐입니다. 따라서 Double과 같은 다른 많은 클래스의 이벤트를 호출하는 많은 다른 템플릿 함수가있을 것입니다. 따라서 모든 기능을 반복해서 복제하는 것은 의미가 없습니다. – Tim

+0

두 번째 제안은 흥미 롭습니다. '_D'를 피할 수 있습니까? – Tim

관련 문제