首页 > 其他 > 详细

CHECK MEMBER TYPE

时间:2015-11-02 11:45:57      阅读:204      评论:0      收藏:0      [点我收藏+]

检查类里是否存在某种类型的几种方法,以检查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");
}

 

CHECK MEMBER TYPE

原文:http://www.cnblogs.com/qicosmos/p/4929393.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!