C++模板判断类中是否存在某个名称的成员函数

由一道C++面试题引发的思考 - 知乎


//判断是否存在指定的成员函数名
template 
struct HasMemF_Fun : public std::false_type {};

template 
struct HasMemF_Fun>
    : std::is_member_function_pointer {};

//判断是否存在指定的成员变量名
template 
struct HasMemV_Name : public std::false_type {};

template 
struct HasMemV_Name>
    : std::is_member_object_pointer {};

struct XXX
{
    void Fun123() {}
    std::wstring name123;
};

int main()
{
    if (HasMemV_Name::value)
    {
        std::cout << "XXX::name123 exists" << std::endl;

    }
    if (HasMemF_Fun::value)
    {
        std::cout << "XXX::Fun123 exists" << std::endl;
    }
}


运行结果:
XXX::name123 exists
XXX::Fun123 exists


#define DEFINE_MEMBERFUNCTION_TRAIT(name, func)                     \
   template                            \
   struct name : public std::false_type {};                         \
                                                                    \
   template                                             \
   struct name>                  \
       : std::is_member_function_pointer {};    \

#define DEFINE_MEMBERVARIABLE_TRAIT(name, memVariable)               \
   template                             \
   struct name : public std::false_type {};                          \
                                                                     \
   template                                              \
   struct name>            \
       : std::is_member_object_pointer {};\

DEFINE_MEMBERFUNCTION_TRAIT(HasFun123, Fun123)
DEFINE_MEMBERVARIABLE_TRAIT(HasName123, name123)

struct XXX
{
    void Fun123() {}
    std::wstring name123;
};

int main()
{
    if (HasFun123::value)
    {
        std::cout << "XXX::Fun123 exists" << std::endl;

    }
    if (HasName123::value)
    {
        std::cout << "XXX::name123 exists" << std::endl;
    }
}

执行结果:
XXX::Fun123 exists
XXX::name123 exists

 

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