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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值