c++ - 是否需要 `void_t` 来检查类是否具有具有特定签名的方法?

标签 c++ c++11 templates template-meta-programming c++17

当我第一次学习如何检查类中的特定签名时,我被教导使用 std::void_t 并编写如下代码:

template<typename T, typename =void>
class HAS:public false_type{};

template<typename T>
class HAS<T,void_t<decltype(declval<T>().print())>>:public true_type{};

这段代码将检查类是否有名为“print()”的方法。它运行良好。

但是当我尝试删除 std::void_t 时,它仍然有效。

代码如下所示:

template<typename T, typename = void>
class HAS:public false_type{};

template<typename T>
class HAS<T,decltype(declval<T>().print())>:public true_type{};

所以我很困惑是否有必要使用“std::void_t”来检查类是否具有具有特定签名的方法?或者这只是巧合?

最佳答案

This question详细解释了如何 void_t (也称为检测成语)有效。关键是只有当第二个模板参数的类型评估为 void 时才会考虑特化。 .

在这种情况下,您的 print() 恰好是方法返回 void , 所以 decltype(declval<T>().print())也是无效的。但是如果你的 print()返回其他东西,比如 bool ,那么特化将不匹配,也不会被使用。

关于c++ - 是否需要 `void_t` 来检查类是否具有具有特定签名的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506605/

相关文章:

c++ - 动态推断函数的返回类型

C++模板交叉定义

c++ - boost 线程抛出异常 "thread_resource_error: resource temporarily unavailable"

c++ - OpenGL 中的多个视口(viewport)和文本......也许是相机?

c++ - 如何从文件中读取 double 值?

c++ - 具有与实例一样多的参数的可变参数模板

c++ - 容器的模板语法

c++ - 如何避免传递函数

c++ - using 声明的可变参数扩展

c++ - 为后期初始化转发参数