c++11判断某个类是否具有某个函数成员

//by 鸟哥 c++11判断某个类是否含有某个成员函数和变量
//有疑问请留言或加群 1032082534
#include
#include
#include
 
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

你可能感兴趣的:(c++)