2010-11-28 2 views
2

다른 곳에서 다른 유형으로 템플릿화할 것으로 예상되는 템플릿 함수가 있습니다.
문제는 두 가지 다른 방법으로 다른 템플릿을 생성하는 특정 형식에 대한 전문화가있는 경우 컴파일 타임에 알고 싶습니다.C++ 템플릿은 주어진 형식에 대해 함수가 오버로드되었는지 확인할 수 있습니까?

template<typename T> 
bool tobool(const T&){ throw Exception("Can't cast to bool");}; 
template<> bool tobool<bool>(const bool &value){ return value;} 

here과 같은 기능 존재 여부를 테스트 할 수 있습니다.

tobool이 특수화되었는지 테스트하는 방법은 무엇입니까?

tobool()이 특수화 된 경우 true를 반환하고 그렇지 않은 경우 false를 반환하는 isbool()을 생성한다고 가정 해 보겠습니다.

+1

정확하게 이해합니까? : 각 유형 T에 대해 tobool이 T에 특수화되었는지 여부를 나타내는 메타 기능을 원하십니까? –

+0

그래, T가 일반 또는 특수화 된 토볼을 사용하는지 알아야합니다. –

+3

그래서 컴파일 타임에 그 존재를 확인하고 그 결과로 무엇을 할 수 있습니까? –

답변

3

, 당신은 오히려 기능보다 구조체의 전문성을 필요로하고, 구조체 전문되었는지 여부를 나타 내기 위해 상수 클래스를 포함 할 수있다 :

template <typename T> 
struct ToBool { 
    static bool tobool(const T&); 
    static const bool specialized = false; 
}; 

또 다른 옵션을 전문화시에만 tobool을 정의하는 것입니다. 이렇게하면 ToBool<Foo>::tobool(f)은 이 전문화되지 않은 클래스 Foo에 대해 컴파일되지 않습니다.

tobool 대신에 변환 할 클래스를 제어 할 수있는 경우 명시 적 변환 연산자를 사용할 수 있습니다. 유형이 부울 변환이없는 경우

class Foo { 
public: 
    operator bool(); 
    ... 
}; 
... 
    Foo f; 
    if (f) ... 

(물론, bool에 표준 변환이 둘 숫자 또는 포인터 타입으로 변환), 프로그램은 컴파일되지 않습니다. Voila, 전환에 대한 시간 확인.

bool로 암시 적 변환을 원하지 않으면 연산자를 정의 할 수 있습니다! 그리고 명시적인 변환을 위해 double-bang을 사용하십시오. (읽을 수있는 것은 아니지만) :

class Foo { 
public: 
    bool operator!(); 
    ... 
}; 

... 
    Foo f; 
    if (!!f) ... 
0

특정 질문에 대한 대답은 다음과 같습니다. 아니요, T가 기본 또는 특수 템플릿을 사용하고 있는지 확인할 수 없습니다. @ 마틴 요크의 질문은 아주 좋은 질문입니다. 왜 지구상에서 그것을 확인하고 싶습니까? : A (다소 추한 부서지기 쉬운) 해결 방법으로

+0

tobool 이 전문화되어 있으면 true를 반환하고 is가 아닌 경우 false를 반환하는 isbool() 메서드가있는 클래스 템플릿 이 있기 때문입니다. –

관련 문제