2010-07-27 3 views
3

유효한 템플릿 인자가 필요한 것을 어떻게 지정할 수 있습니까?템플릿 인자 지정

template<class T> 
void f(const T& obj) 
{ 
//do something with obj 
} 

그러나 나는 내가 문자, INT, 짧은 부호 등하지만 아무것도를 받아 들일 만 정수형으로 T 싶습니다 : 내 말은, 예를 들어 보자의이 같은 것을 가지고있다. 템플릿 인자로 제공되는 것을 탐지하는 방법이 있습니까?
감사합니다.

답변

3
+1

A-HA는 유형 특성을 기반으로 템플릿 인스턴스화를 사용/사용 중지하려고합니다. Boost Concept Check Library는 템플릿 관련 컴파일러 오류 메시지를 해독합니다. A-ha가 원하는 것을하지 않습니다. 그는 필요한 모든 개념을 지원하더라도 특정 유형에 대한 템플릿 인스턴스화를 비활성화하려고합니다. 예를 들어, double은 함수 본문 내에서 수행하는 모든 작업을 지원할 수 있지만 템플릿을 double 유형으로 사용하지 않으려합니다. 개념 검사는 적절한 해결책이 아닙니다. enable_if 및 type_traits가 방법입니다. – user401947

+0

그의 질문에서 : - "유효한 템플릿 인수가 필요한 것". - "char, int, 짧은 서명되지 않은 기타 등은 허용합니다." (그리고 btw, 내 대답이 받아 들여집니다 ;-)) – Scharron

5

당신은 boost::enable_ifboost::is_integral이 (또한 TR1에 포함)를 사용할 수 있습니다 :

#include <boost/utility/enable_if.hpp> 
#include <boost/type_traits/is_integral.hpp> 

template <typename T> 
typename boost::enable_if<boost::is_integral<T> >::type 
f(const T & obj) 
{ 
    ... 
} 
+0

이것이 방법입니다. Boost Concept Check Library가 적합하지 않습니다. – user401947

2

당신이 정수가 아닌 유형은 컴파일 오류가 발생하려면, 당신은 또한 정적으로 주장 할 수 있습니다 (컴파일 시간의 주장을). 와

C++ 0X :

#include <utility> 

template <class T> 
void foo(T) 
{ 
    static_assert(std::is_integral<T>::value, "Only integral types allowed"); 
} 

int main() 
{ 
    foo(3); //OK 
    foo(3.14); //makes assertion fail 
} 

C++ 03로, 부스트 도움이 될 것입니다 :

#include <boost/type_traits.hpp> 
#include <boost/static_assert.hpp> 

template <class T> 
void foo(T) 
{ 
    BOOST_STATIC_ASSERT(boost::is_integral<T>::value); 
} 

int main() 
{ 
    foo(3); 
    foo(3.14); 
} 

(IMO, enable_if 당신의 다른 버전을 사용하려는 시나리오입니다 다른 유형에 대한 함수 및 오류 발생을 피하십시오. 다른 모든 유형에 대해 오류를 원할 경우, 기능을 사용 불가능으로 설정하면 "도움이되는 일치하는 함수가 없습니다"라는 메시지가 표시 될 수도 있습니다. 정수가 허용되지 않는 코드의 위치로)

+0

"전화 할 일치 기능 없음"메시지가 잘못되었습니다. 잘못된 인수가 함수에 연결된 장소를 가리 킵니다. 당신이 원하는게 뭐야? enable_if는 솔루션이 과부하 해결을 방해하므로 우수합니다. foo (3.14)와 일치 할 수있는 foo (float) 오버로드가있을 수 있지만 템플릿 함수가 선택되어 있기 때문에 호출되지 않습니다. – user401947

+0

@ rn141 : 나는 그것이 달려 있다고 말했다. * 다른 과부하가 없으면 "호출 할 일치하는 함수가 없습니다."는 다소 모호한 진단입니다. – UncleBens

+0

+2 나는 너의 대답을 정말로 좋아한다. –

관련 문제