#include <iostream>
#include <type_traits>
// 检查 xxxx 是否是类T的成员
template <typename T>
struct has_member_xxxx
{
// 如果 &T::xxxx 合法, 本函数就合法
// 下面check<T>(0)优先调用本函数, 返回值是void
template<typename U>
static void check(decltype(&U::xxxx));
// 否则, 下面chech<T>(0)调用本函数
// 返回值是int
template<typename U>
static int check(...);
// 如果check<T>(0)的返回值是void,
// 则&T::xxxx合法, xxxx是T的成员
enum { value = std::is_void<decltype(check<T>(0))>::value };
};
struct A
{
int xxxx;
};
struct B
{
void xxxx() {};
};
struct C
{
};
int main(int argc, char** argv)
{
std::cout << "A::xxxx = " << has_member_xxxx<A>::value << std::endl;
std::cout << "B::xxxx = " << has_member_xxxx<B>::value << std::endl;
std::cout << "C::xxxx = " << has_member_xxxx<C>::value << std::endl;
return 0;
}
/*
运行输出
A::xxxx = 1
B::xxxx = 1
C::xxxx = 0
*/
一种更简洁的实现, 见 https://blog.csdn.net/netyeaxi/article/details/83479646