c++ - 如何检查类中是否存在成员名称(变量或函数),是否指定类型?

标签 c++ class templates macros member

这个Q是以下的扩展:
Templated check for the existence of a class member function?

是否有任何实用程序可以帮助查找:

  • 成员名称是否存在于类中?该成员可以是 变量或方法。
  • 指定成员的类型应该是可选的

最佳答案

std::experimental::is_detected std::experimental::disjunction 你可以这样做:

//check for a type member named foo
template <typename T>
using foo_type_t = typename T::foo;

//check for a non-type member named foo
template <typename T>
using foo_non_type_t = decltype(&T::foo);

template <typename T>
using has_foo = disjunction<is_detected<foo_type_t, T>,
                            is_detected<foo_non_type_t, T>>;

然后你会使用has_foo<my_class>::value随心所欲。

以上不仅适用于类型和成员函数,而且您可以使用 std::is_member_function_pointer 等特征轻松地对其进行约束。和 std::is_member_object_pointer如果你愿意。

要提供您的可选参数,您可以使用 std::experimental::is_detected_exact helper 。

Live Demo


请注意,如果您从我链接的页面中获取上述特征的实现,则可以将其与 C++14 一起使用。对 disjunction 的一个小改动代码将允许您在 C++11 中使用它。

关于c++ - 如何检查类中是否存在成员名称(变量或函数),是否指定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36079170/

相关文章:

c++ - 如何在不声明类型的情况下将模板发送到另一个模板?

c++ - C++ 中的模板实例化

c# - 手工翻译代码的技巧

python - 装饰器创建类

c++ - QTreeView、QFileSystemModel、setRootPath 和 QSortFilterProxyModel 以及用于过滤的 RegExp

html - 从 font-awesome v4 到 v5

c++ - `using` 是什么,C++ 中构造函数后面的冒号是什么

java - 玩法 2 - 如何从 Java Controller 设置模板参数的默认值?

c++ - 如何判断表达式是在编译时还是运行时求值?

c++ - QTreeView:维护QModelIndex与底层数据的映射