2017-04-21 13 views
0

クラスが特定のテンプレートの特殊化であるかどうかを判断するタイプの特性が必要です。 This answerは、ほとんどの場合に機能する実装を提供します。静的なconstexprメンバのis_specialization型の特性

しかし、静的な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>{}); 
} 

私は2つの質問があります私は静的なconstexprメンバの型を参照していますか?

答えて

0

静的なconstexprメンバーのタイプを崩してcv-qualifierを削除すると、この機能が検出されました。

static_assert(is_specialization<std::decay_t<decltype(foo::z)>, bar>{}); 
関連する問題