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

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


//判断是否存在指定的成员函数名
template <typename T, typename = void>
struct HasMemF_Fun : public std::false_type {};

template <typename T>
struct HasMemF_Fun<T, std::void_t<decltype(&T::Fun123)>>
    : std::is_member_function_pointer<decltype(&T::Fun123)> {};

//判断是否存在指定的成员变量名
template <typename T, typename = void>
struct HasMemV_Name : public std::false_type {};

template <typename T>
struct HasMemV_Name<T, std::void_t<decltype(&T::name123)>>
    : std::is_member_object_pointer<decltype(&T::name123)> {};

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

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

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


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


#define DEFINE_MEMBERFUNCTION_TRAIT(name, func)                     \
   template <typename T, typename = void>                           \
   struct name : public std::false_type {};                         \
                                                                    \
   template <typename T>                                            \
   struct name<T, std::void_t<decltype(&T::func)>>                  \
       : std::is_member_function_pointer<decltype(&T::func)> {};    \

#define DEFINE_MEMBERVARIABLE_TRAIT(name, memVariable)               \
   template <typename T, typename = void>                            \
   struct name : public std::false_type {};                          \
                                                                     \
   template <typename T>                                             \
   struct name<T, std::void_t<decltype(&T::memVariable)>>            \
       : std::is_member_object_pointer<decltype(&T::memVariable)> {};\

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

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

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

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

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

 

相关推荐

  1. C++模板判断是否存在某个名称成员函数

    2024-02-02 01:36:02       60 阅读
  2. C#判断MySQL数据库是否存在某个数据库或数据表

    2024-02-02 01:36:02       35 阅读
  3. C# 判断文件路径后缀是否某个后缀

    2024-02-02 01:36:02       70 阅读
  4. c++判断路径是否存在判断文件夹是否存在

    2024-02-02 01:36:02       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 01:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 01:36:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 01:36:02       82 阅读
  4. Python语言-面向对象

    2024-02-02 01:36:02       91 阅读

热门阅读

  1. ZooKeeper客户端实战

    2024-02-02 01:36:02       44 阅读
  2. 433. 最小基因变化

    2024-02-02 01:36:02       56 阅读
  3. MongoDB实战 – 用MongoDB Shell访问MongoDB数据库

    2024-02-02 01:36:02       53 阅读
  4. 与后端配合单个/批量导出excel的方法

    2024-02-02 01:36:02       49 阅读
  5. c入门第一篇——hello c!

    2024-02-02 01:36:02       50 阅读
  6. Apache Commons

    2024-02-02 01:36:02       59 阅读