当我第一次学习如何检查类中的特定签名时,我被教导使用 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/