2013-03-27 1 views
1

C++ 템플릿 함수를 작성하는 동안이 함수가 사용하는 변수 유형이 필수인지 확인해야합니다. 이 경우 컴파일 오류가 발생합니다.반복자 값에 정수 유형이 있는지 테스트하려면 어떻게해야합니까?

template <class IT> void foo(IT first, IT last) { 
    // check here that *first has integral type. 
} 

내가 가진 문제는이 함수 템플릿 매개 변수가 사용 된 유형이 아니라 반복자 유형이라는 것입니다.

불행히도 저는 현재 C++ 11이나 부스트를 사용할 수없는 환경에 있기 때문에이 휠을 직접 재발견해야 할 것입니다.

매개 변수 배열 크기를 사용하여 배열에 대한 포인터를 정의하여 형식이 필수적이라는 테스트가 끝났습니다. 매개 변수 유형이 정수가 아니면 컴파일 오류가 발생합니다.

template <class IT> void foo(IT first, IT last) { 
    int (* fake_array_ptr)[*first]; // Error: size of array has non-integral type 
} 

내 질문은 : 유형이 통합 여부를 테스트하기 위해 다른 더 명시 적 방법이 있습니까?

+3

"참고 : C++ 11 또는 부스트를 사용할 수 없습니다." 왜? 부스트를 사용할 수없는 좋은 이유를 말해줘. – Xeo

+1

* 좋은 이유 *를 갖고 싶지만 현재 프로젝트에서 사용할 수 없다는 점을 제외하고는 아무 것도 없습니다. –

+3

@DidierTrosset 자신의'is_integral' 템플릿을 구현해야하는 것처럼 보입니다. – juanchopanza

답변

3

배열 크기를 매개 변수로 사용하여 배열에 대한 포인터를 정의하여 형식이 필수적이라는 테스트가 끝났습니다. 매개 변수 유형이 정수가 아니면 컴파일 오류가 발생합니다.

이것은 휴대 할 수 없습니다. 배열 크기는 정수 상수 표현식이어야하므로 매개 변수 유형이 정수인 경우에도 컴파일 오류가 발생할 수 있습니다. 컴파일러는 C99 가변 길이 배열을 확장으로 가지고 있으며 기본적으로 활성화되어 있기 때문에 현재 컴파일됩니다.

휴대용 통합형에는 유한 번호가 있습니다. 이들 각각에 대한 명시 적 전문화는 C++ 03에 is_integral을 구현하는 이식성있는 방법입니다. 이 특성이 거짓 산출 할 때 컴파일 오류가 발생하기 위해

template <typename T> 
struct is_integral { static const bool value = false; }; 

template <> 
struct is_integral<char> { static const bool value = true; }; 

template <> 
struct is_integral<signed char> { static const bool value = true; }; 

template <> 
struct is_integral<unsigned char> { static const bool value = true; }; 

template <> 
struct is_integral<short> { static const bool value = true; }; 

// and so on 

template <> 
struct is_integral<unsigned long> { static const bool value = true; }; 

, 하나는 C++ (11), 또는 BOOST_STATIC_ASSERTstatic_assert을 사용합니다. 이전 질문은 how to implement BOOST_STATIC_ASSERT on your own입니다.

+0

좋아 보이지만 이것을 내 반복자 유형에 어떻게 사용합니까? 나는 is_integral :: value'을 사용하기 위해 직접적으로 타입을 가지고 있지 않다. iterator 타입의 IT이다. –

+0

'typename std :: iterator_traits :: value_type'는 테스트에 사용할 적절한 유형을 제공해야합니다. –

관련 문제