gpt4 book ai didi

c++ - 带两个参数的 decltype 是什么?

转载 作者:IT老高 更新时间:2023-10-28 14:02:12 26 4
gpt4 key购买 nike

Edit, in order to avoid confusion: decltype does not accept two arguments. See answers.

以下两个结构可用于在编译时检查类型 T 上的成员函数是否存在:

// Non-templated helper struct:
struct _test_has_foo {
template<class T>
static auto test(T* p) -> decltype(p->foo(), std::true_type());

template<class>
static auto test(...) -> std::false_type;
};

// Templated actual struct:
template<class T>
struct has_foo : decltype(_test_has_foo::test<T>(0))
{};

我认为这个想法是在检查成员函数的存在时使用 SFINAE,所以如果 p->foo() 无效,只有 的省略号版本test,它返回 std::false_type 被定义。否则为 T* 定义第一个方法并将返回 std::true_type。实际的“切换”发生在第二个类中,它继承自 test 返回的类型。与使用 is_same 之类的不同方法相比,这似乎很聪明且“轻量级”。

带有两个参数的 decltype 首先让我感到惊讶,因为我认为它只是获取表达式的类型。当我看到上面的代码时,我认为它类似于“尝试编译表达式并始终返回第二个的类型。如果表达式编译失败则失败”(所以隐藏这个特化;SFINAE)。

但是:

然后我想我可以使用这种方法来编写任何“有效表达式”检查器,只要它依赖于某种类型 T。示例:

...
template<class T>
static auto test(T* p) -> decltype(bar(*p), std::true_type());
...

http://ideone.com/dJkLPF

我想,当且仅当 bar 被定义并接受 T 作为第一个参数(或者如果 T 是可转换的,等等...),即:如果 bar(*p) 是在 p 定义为 T* 类型。

但是,上面的修改将 always 评估为 std::false_type为什么会这样?我不想用一些复杂的不同代码来修复它。我只是想知道为什么它不能像我预期的那样工作。显然,带有两个参数的 decltype 的工作方式与我想象的不同。我找不到任何文件;处处只能用一种表达方式来解释。

最佳答案

这是一个逗号分隔的表达式列表,类型与列表中最后一个表达式的类型相同。它通常用于验证 first 表达式是否有效(可编译,想想 SFINAE),第二个用于指定 decltype 在第一个表达式有效的情况下应该返回。

关于c++ - 带两个参数的 decltype 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044514/

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