2015-01-20 4 views
2

다른 유형의 중첩 된 클래스 템플릿의 존재를 감지하는 유형 특성을 만들고 싶습니다.중첩 템플릿의 유형을 확인하는 방법은 무엇입니까?

#include <cassert> 

template<class T> 
struct has_foo 
{ 
    // XXX what goes here? 
}; 

struct with_foo 
{ 
    template<class T> struct foo {}; 
}; 

struct without_foo {}; 

int main() 
{ 
    assert(has_foo<with_foo>::value); 
    assert(!has_foo<without_foo>::value); 

    return 0; 
} 

has_foo을 구현하는 가장 좋은 방법은 무엇 :

예를 들어

, 나는 어떤 종류의 Tfoo라는 하나 개의 매개 변수의 중첩 템플릿의 존재를 감지 유형의 특성 has_foo을 작성한다고 가정 ?

+0

'foo' 만 유형을 사용합니까? 아니면 임의의 템플릿입니까? – Columbo

+0

'foo'는 단일 타입 매개 변수만을 취합니다. –

답변

5
template <template<class> class> using void_templ = void; 

template <typename, typename=void> struct has_foo : std::false_type {}; 

template <typename T> 
struct has_foo<T, void_templ<T::template foo>> : std::true_type {}; 

Demo. GCC는 모든 유형을 허용합니다. 그것은 버그입니다. void_templ 클래스 템플릿

template <template<class> class> 
struct void_templ {using type = void;}; 

Demo 만드는 것이 해결하려면.

+0

사실 나는이 버그에 대해 잘 모르겠습니다. 별칭 템플릿은 전문화 될 수 없으므로, 항상 'void'로 정의되면 ... 그러나 Clang은 동의하지 않습니다. 그리고 추론 된 주장을 대체 할 때 여전히 오류가있을 것입니다. – Columbo

+0

[CWG 1558] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1558). 또한 형식 매개 변수 팩을 사용하는'void_t '가 표준에 투표되었으므로이를 다른 이름으로 변경하려고 할 수 있습니다. 정확히 하나의 매개 변수를 사용하도록 서명을 변경해야 할 수도 있습니다. –

+0

@ T.C. CWG 문제가 있다는 것을 알고있었습니다 :-). 그리고 나는'void_t'에 대해 몰랐습니다. – Columbo

관련 문제