//by 鸟哥 c++11判断某个类是否含有某个成员函数和变量
//有疑问请留言或加群 1032082534
#include<iostream>
#include<utility>
#include<type_traits>
template<typename T>
struct has_member_f1
{
private:
template<typename U>
static auto Check(int) -> decltype( std::declval<U>().f1(), std::true_type() );
template<typename U>
static std::false_type Check(...);
public:
enum { value = std::is_same<decltype(Check<T>(0)),std::true_type>::value };
};
template<typename T>
struct has_member_aa
{
private:
template<typename U>
static auto Check(int) -> decltype( std::declval<U>().aa,std::true_type() );
template<typename U>
static std::false_type Check(...);
public:
enum { value = std::is_same<decltype(Check<T>(0)),std::true_type>::value };
};
struct class1
{
int aa;//(){return 1;};
void f1() { std::cout << "f1" << std::endl; }
};
struct class2
{
void f2() { std::cout << "f2" << std::endl; }
};
int main()
{
//1、判断是否包含函数成员
if( has_member_f1<class1>::value ){
std::cout << "class1 包含 函数f1" << std::endl;
}
else{
std::cout << "class1 不包含函数f1" << std::endl;
}
if( has_member_f1<class2>::value )
std::cout << "class2 包含 函数f1" << std::endl;
else{
std::cout << "class2 不包含 函数f1" << std::endl;
}
//2、判断是否包含成员变量
if( has_member_aa<class1>::value ){
std::cout << "class1 包含变量aa" << std::endl;
}
else{
std::cout << "class1 不包含变量aa" << std::endl;
}
if( has_member_aa<class2>::value )
std::cout << "class2 包含变量aa" << std::endl;
else{
std::cout << "class2 不包含变量aa" << std::endl;
}
return 0;
}
运行结果:
class1 包含 函数f1
class2 不包含 函数f1
class1 包含变量aa
class2 不包含变量aa