gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:45 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com