2012-10-09 6 views
1

다음과 같은 boost :: variant 메서드를 사용하고 있습니다. 나는 T 타입에 기초하여 값을 얻으려고 노력한다. boost::get<T>이 실패하면 T가 int 또는 unsigned int 인 경우이를 특수한 방식으로 처리하려고합니다. T이 int인지 unsigned int인지 알 수있는 방법이 있습니까?템플릿 값에서 유형 가져 오기, C++

이 경우 템플릿 전문화를 사용할 수 있다고 생각하지 않습니다.

편집 : 또한, 나는 아직 C++ (11)에 대한 액세스 권한이없는 (곧 희망)

template < typename T, typename C, void (C::*setterFcn)(const T&) > 
void binder(const Variant& value_var, C* c) 
{ 
    const T* typeData = boost::get<T>(&value_var); 

    if (NULL == typeData) 
    { 
     // Need to check for int or unsigned int here somehow 
    } 

    (((C*) c)->*(setterFcn))(*typeData); 
} 
+1

'std :: is_same :: value'과 (와) 비슷한가요? 아니면 int를 위해 모든 것을 전문화하십시오. –

+0

부분 템플릿 전문화를 수행 할 수 있다고 생각하지 않습니다. –

+0

@NicFoster : 아니요, 기능 템플릿을 부분적으로 특수화 할 수 없으므로 아니요. 그러나 _overload__를 사용하면이 작업을 쉽게 수행 할 수 있습니다. – ildjarn

답변

4

C++ 11에서는 std::is_same을 사용할 수 있으며 03 C++에서이 같은 일을 할 수 있습니다

template <typename T1, typename T2> 
class is_same 
{ 
public: 
    static bool const value = false; 
}; 

template <typename T> 
class is_same<T, T> 
{ 
public: 
    static bool const value = true; 
}; 

및 C++ 11 표준 버전으로 정확히를 사용합니다.

+0

Griwes, 편집 해 주셔서 감사합니다. 난 그냥 문서에 가서 정확히 당신이 제안한 업데이 트 싶었어요. 이 방법으로 C++ 11로 전환하는 것은 어려울 것입니다. – detunized

1

가장 쉬운 방법은 오버로드 기능 또는 기능 템플릿에 위임 아마 : 당신은 일반적인 처리, 아마도 하나의 함수에서, 아무것도하지 않고 및 전문 별도의 두 중 처리를 지정 함수 (특별한 처리가 쉬운 경우) 또는 int 또는 unsigned int을 검사하는 조건을 가진 enable_if ed 함수에서.