您的位置:首页 > 其它

CHECK MEMBER TYPE

2015-11-02 10:14 260 查看
检查类里是否存在某种类型的几种方法,以检查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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: