2011-01-09 6 views
2

전달 된 템플릿 클래스 형식에 따라 동작을 변경하는 템플릿 함수를 작성하고 싶습니다. 이렇게하려면 전달 된 형식을 결정하고 싶습니다. 예를 들어, 다음과 같은 내용이 있습니다.C++에서 동일한 기본 형식에 대한 별칭인지 여부 확인

template <class T> 
void foo() { 
    if (T == int) { // Sadly, this sort of comparison doesn't work 
    printf("Template parameter was int\n"); 
    } else if (T == char) { 
    printf("Template parameter was char\n"); 
    } 
} 

이것이 가능합니까?

+0

'T'가'int' 인 경우에만) 또는 전체 유형 그룹 ('T'가 포인터 인 경우) 또는'T '정수형 또는'T'가 부호없는 경우) – jalf

+0

foo를 여기 호출 할 때 컴파일러가 형식을 추론 할 수있는 방법이 없으므로 형식을 수동으로 지정해야합니다. 'foo ()'또는'foo ()'또는'foo ()'등등.'foo ()'은'Template parameter was int'를 출력합니다. –

답변

2

,이 컴파일시에 수행 할 수 있습니다.

+6

왜'foo'를 직접적으로 전문화하지 않는 것이 좋을까요? 이것은'if ... else if ... '에 대한 필요성을 제거 할 것이다. –

+0

그래서 컴파일 타임에 알고있는 것에 대한 런타임 비용을 추가하고 싶습니까? –

+0

@Martin York 컴파일러에 의존합니다. is_same_type :: value는 컴파일 타임 상수이므로 if가 최적화 될 수 있습니다. 그러나 그렇습니다, 나는 foo를 전문으로하는 것이 더 좋은 아이디어라고 동의합니다. –

8

이것은 템플릿 전문화의 목적이며,이 용어를 검색하면 수많은 예제가 제공됩니다.

#include <iostream> 

template <typename T> 
void foo() 
{ 
    std::cout << "Unknown type " << typeid(T).name() << "\n"; 
} 

template<typename T> 
void fooT(T const& x) { foo<T>(); } 

template<> 
void foo<int>() 
{ printf("Template parameter was int\n"); 
} 

template<> 
void foo<char>() 
{ printf("Template parameter was char\n"); 
} 

int main() 
{ 
    fooT(std::cout); 
    fooT(5); 
    fooT('a'); 
    fooT("Look Here"); 
} 
+0

더 이상 말할 필요가 없습니다. – Puppy

0

type_info를 직접 사용하거나 더 나은 여전히 ​​typeid 연산자를 사용하십시오.

template<class T, class U> 
struct is_same_type 
{ 
    static const bool value = false; 
}; 
template<class T> 
struct is_same_type<T, T> 
{ 
    static const bool value = true; 
}; 

template <class T> 
void foo() 
{ 
    if (is_same_type<T, int>::value) 
    { 
     printf("Template parameter was int\n"); 
    } 
    else if (is_same_type<T, char>::value) 
    { 
     printf("Template parameter was char\n"); 
    } 
} 

내 머리에 컴파일하지만, 그럼에도 불구하고 작동합니다 : 부분 특수화의 힘을 사용하여

#include <typeinfo> 
template < typename T > 
T max(T arg1, T arg2) { 
    cout << typeid(T).name() << "s compared." << endl; 
    return (arg1 > arg2 ? arg1 : arg2); 
} 
1

템플릿 전문화 또는 typeid 사용은 아마도 당신에게 유용 할 것입니다. 그러나 템플릿 전문화는 선호합니다. 이는 런타임에 typeid의 런타임 비용이 발생하지 않기 때문입니다. 예를 들면 다음과 같습니다 :