2017-04-21 8 views
0

클래스가 주어진 템플릿의 특성화 여부를 결정하는 형식 특성이 필요합니다. This answer은 대부분의 경우에 작동하는 구현을 제공합니다.정적 constexpr 멤버에 대한 is_specialization 형식 특성

그러나 static constexpr 멤버 유형에는 작동하지 않는 것 같습니다. (wandbox에서도 사용 가능) 다음 예에서 마지막 static_assert는 연타와 GCC 트렁크에 실패 :이 올바른 행동하고, 어떻게 내가이 일을하는 타입의 특성을 작성할 수 있습니다

#include <type_traits> 

// from https://stackoverflow.com/questions/16337610/how-to-know-if-a-type-is-a-specialization-of-stdvector 
template<typename Test, template<typename...> class Ref> 
struct is_specialization : std::false_type {}; 

template<template<typename...> class Ref, typename... Args> 
struct is_specialization<Ref<Args...>, Ref>: std::true_type {}; 

template<typename T> 
struct bar { 
    bool x; 
}; 

struct foo { 
    bar<int> y; 
    static constexpr bar<bool> z{true}; 
}; 

int main() { 
    static_assert(is_specialization<decltype(foo::y), bar>{}); 
    static_assert(is_specialization<decltype(foo::z), bar>{}); 
} 

나는이 개 질문이 static constexpr 멤버의 유형을 참조합니까?

답변

0

정적 constexpr 멤버의 유형을 쇠퇴시켜 cv 한정자를 제거하면 작동하는 것으로 나타났습니다.

static_assert(is_specialization<std::decay_t<decltype(foo::z)>, bar>{});