유효한 템플릿 인자가 필요한 것을 어떻게 지정할 수 있습니까?템플릿 인자 지정
template<class T>
void f(const T& obj)
{
//do something with obj
}
그러나 나는 내가 문자, INT, 짧은 부호 등하지만 아무것도를 받아 들일 만 정수형으로 T 싶습니다 : 내 말은, 예를 들어 보자의이 같은 것을 가지고있다. 템플릿 인자로 제공되는 것을 탐지하는 방법이 있습니까?
감사합니다.
유효한 템플릿 인자가 필요한 것을 어떻게 지정할 수 있습니까?템플릿 인자 지정
template<class T>
void f(const T& obj)
{
//do something with obj
}
그러나 나는 내가 문자, INT, 짧은 부호 등하지만 아무것도를 받아 들일 만 정수형으로 T 싶습니다 : 내 말은, 예를 들어 보자의이 같은 것을 가지고있다. 템플릿 인자로 제공되는 것을 탐지하는 방법이 있습니까?
감사합니다.
당신은 boost::enable_if 및 boost::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)
{
...
}
이것이 방법입니다. Boost Concept Check Library가 적합하지 않습니다. – user401947
당신이 정수가 아닌 유형은 컴파일 오류가 발생하려면, 당신은 또한 정적으로 주장 할 수 있습니다 (컴파일 시간의 주장을). 와
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
당신의 다른 버전을 사용하려는 시나리오입니다 다른 유형에 대한 함수 및 오류 발생을 피하십시오. 다른 모든 유형에 대해 오류를 원할 경우, 기능을 사용 불가능으로 설정하면 "도움이되는 일치하는 함수가 없습니다"라는 메시지가 표시 될 수도 있습니다. 정수가 허용되지 않는 코드의 위치로)
"전화 할 일치 기능 없음"메시지가 잘못되었습니다. 잘못된 인수가 함수에 연결된 장소를 가리 킵니다. 당신이 원하는게 뭐야? enable_if는 솔루션이 과부하 해결을 방해하므로 우수합니다. foo (3.14)와 일치 할 수있는 foo (float) 오버로드가있을 수 있지만 템플릿 함수가 선택되어 있기 때문에 호출되지 않습니다. – user401947
@ rn141 : 나는 그것이 달려 있다고 말했다. * 다른 과부하가 없으면 "호출 할 일치하는 함수가 없습니다."는 다소 모호한 진단입니다. – UncleBens
+2 나는 너의 대답을 정말로 좋아한다. –
A-HA는 유형 특성을 기반으로 템플릿 인스턴스화를 사용/사용 중지하려고합니다. Boost Concept Check Library는 템플릿 관련 컴파일러 오류 메시지를 해독합니다. A-ha가 원하는 것을하지 않습니다. 그는 필요한 모든 개념을 지원하더라도 특정 유형에 대한 템플릿 인스턴스화를 비활성화하려고합니다. 예를 들어, double은 함수 본문 내에서 수행하는 모든 작업을 지원할 수 있지만 템플릿을 double 유형으로 사용하지 않으려합니다. 개념 검사는 적절한 해결책이 아닙니다. enable_if 및 type_traits가 방법입니다. – user401947
그의 질문에서 : - "유효한 템플릿 인수가 필요한 것". - "char, int, 짧은 서명되지 않은 기타 등은 허용합니다." (그리고 btw, 내 대답이 받아 들여집니다 ;-)) – Scharron