2009-09-20 5 views
3

이제 Concepts가 C++ 0x의 일부가 아니므로 템플릿 함수의 형식에 제한을 가하는 메서드를 찾고 있습니다. 우리는 주어진 형식이 정수가 있는지 확인하려면C++ 0x 개념이없는 템플릿 함수 유형의 제한 부과

, 우리가 사용할 수 있습니다 :

template <class N> inline int f(const N n) 
{ 
    if ((N)0.1 != 0)    // if type of N is floating-point 
     err() 

    .... 
} 

주어진 것을 우리가 확인하고 싶은 경우

는 다음 두 가지 예 유형은 부호없는 정수, 우리가 사용할 수 있습니다

template <class N> inline int f(const N n) 
{ 
    if ((N)-1 < (N)1)    // if type of N is floating-point/signed-integer 
     err() 

    .... 
} 

을 나는 창조적 인 방법을 찾고 t o 컴파일 타임 (개념없이 RTTI없이)에서 런타임에 오류가 발생할 수있는 추가 제한 사항을 확인합니다.

제안 사항?

답변

12

당신의 수표는 타입 - 특성을 사용하여 컴파일 할 때 훨씬 더 잘 처리 될 수 있습니다.

첫 번째

:

STATIC_ASSERT(std::numeric_limits<N>::is_integer) 

두 번째 :

STATIC_ASSERT(not std::numeric_limits<M>::is_signed) 

Boost Concept Check Library에서와 Boost.StaticAssert에서보세요.

2

제한된 기능 템플릿은 확장 된 SFINAE를 통해 근사 할 수 있습니다. 다음은 실제로 C++ 0X 모드에서 GCC 4.4.1로 컴파일 예는 다음과 같습니다

#include <iostream> 
#include <type_traits> 

#define REQUIRES(...) ,class=typename std::enable_if<(__VA_ARGS__)>::type 

template <typename IntType 
    REQUIRES(std::is_integral<IntType>::value) 
> 
inline IntType f(IntType n) { 
    return n; 
} 

int main() { 
    std::cout << f(2) << '\n'; 
    // std::cout << f(3.1415) << '\n'; // won't work 
} 

SFINAE의 좋은 점은 템플릿 인수 공제가 실패 할 때 함수 템플릿은 무시되고의 일부가되지 않습니다 과부하 세트. 위의 예제는 C++ 0x가 함수 템플릿에 대한 기본 템플릿 인수를 지원한다는 사실을 이용합니다. 좋은 오래된 C++ 98에서는 그 결과는 다음과 같습니다

template <typename IntType> 
inline 
typename boost::enable_if_c<(
    std::numeric_limits<IntType>::is_integer 
),IntType>::type f(IntType n) { 
    return n; 
} 

건배, S를

0

쉽게 당신은 또한

template <typename T> 
class MyClass 
{ 
private: 
    static ClassA *checkIfTIsA() { return (T *)NULL; } 
}; 
을 할 수있는 상속을 확인하려면