CHECK MEMBER TYPE

检查类里是否存在某种类型的几种方法,以检查xxx类型为例:
方法1:

template<class T>
class has_member_type_Type
{
    struct big { char a[2]; };
    template<class C> static big  probe(typename C::xxx*); // match here if type T::Type exists
    template<class C> static char probe(...);
public:
    static const bool value = sizeof(probe<T>(nullptr)) > 1;
};

方法2:

template<typename T, typename = typename T::xxx>
static std::true_type has_xxx_impl(int);
 
template<typename T>
static std::false_type has_xxx_impl(...);
 
template<typename T>
struct has_xxx : decltype(has_xxx_impl<T>(0))
{
};

方法3:

template<typename... Ts> struct make_void { typedef void type; };
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
 
template<typename T, typename = void>
struct has_yyy : std::false_type
{
};
 
template<typename T>
struct has_yyy < T, void_t<typename T::xxx>> : std::true_type
{
};
 
//用宏简化
#define HAS_TYPE_MEMBER(MEMBER)\
    template<typename T, typename = void>\
    struct has_type_##MEMBER : std::false_type\
    {\
    };\
    template<typename T>\
    struct has_type_##MEMBER < T, void_t<typename T::MEMBER>>:\
    std::true_type\
    {\
    };
 
    HAS_TYPE_MEMBER(xxx)

测试代码:

struct MyStruct
{
    typedef char xxx;
};

int main()
{
    static_assert(has_xxx<MyStruct>::value, "no xxx");
    static_assert(has_type_xxx<MyStruct>::value, "no xxx");
}

 

posted on 2015-11-02 10:14  qicosmos(江南)  阅读(1503)  评论(1编辑  收藏  举报

导航