gpt4 book ai didi

c++11 - Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of

转载 作者:行者123 更新时间:2023-12-04 15:58:51 24 4
gpt4 key购买 nike

有没有人看过 Andrei Alexandrescu 在 GoingNative2013 中关于爆炸元组的演讲?

这是我不太了解的一段代码:

template <class F, class... Ts>
auto explode(F&& f, const tuple<Ts...>& t)
-> typename result_of<F(Ts...)>::type
{
return Expander<sizeof...(Ts),
typename result_of<F(Ts...)>::type,
F,
const tuple<Ts...>&>::expand(f, t);
}

result_of 中的 F(Ts...) 给我带来了很多麻烦。我的意思是: F 不代表函数类型吗?
我知道 R(Ts...) 很好,但是这里的 R 是一个返回类型,但是在 R 应该在的地方使用 F,这让我发疯......

谁能帮我理解这里奇怪的 F(Ts...) 吗?

这是 Andrei Alexandrescu 演讲的链接:
http://channel9.msdn.com/Events/GoingNative/2013/The-Way-of-the-Exploding-Tuple

最佳答案

你想问的问题可能是这个问题的重复:Why does std::result_of take an (unrelated) function type as a type argument?

我们来剖析一下:

std::result_of<F(Ts...)>::type

所以,在 namespace std 的某个地方, 我们有一个类模板 result_of<> .它需要一个模板类型参数;即,它看起来基本上是这样的:
template<typename Foo>
struct result_of
{
typedef FOOBARBAZ type;
};

好的,所以,我们用参数 F(Ts...) 实例化这个模板.这是不寻常的语法!你大概知道 Ts是一个参数包,因此 Ts...括号内的将在编译时扩展为逗号分隔的类型列表,例如 int, double, bool .所以我们有 F(int, double, bool) .好的,这是一个函数类型。

正如 int(char)表示“函数采用 char 并返回 int”, F(int, double, bool) 也是如此意思是“函数取 int, double, bool 并返回 F”。

“但是等等,”你说。 “我以为 F 已经是我的函数类型了!”

是的。 F您的 函数类型。但是 std::result_of 预期的类型是,真的!,该函数类型包含在另一个函数类型中。详细说明:
typedef int (*F)(char);
typedef F G(char);
static_assert(std::is_same< std::result_of<G>::type, int >::value);
static_assert(std::is_same< std::result_of<F(char)>::type, int >::value);
static_assert(std::is_same< std::result_of<int (*(char))(char)>::type, int >::value);

以上每一行都完全等效: F(char)只是一种更美观的写作方式 int (*(char))(char) .当然,您不能总是侥幸逃脱,因为有时 F是不能从函数返回的函数类型:
typedef int F(char);
std::result_of<F(char)>; // fails to compile

正如@Simple 在评论中所写, std::result_of<F(Ts...)>::type总是可以用不那么聪明但也不那么令人困惑的表达来代替
decltype( std::declval<F>() ( std::declval<Ts>()... ) )

即,“使用类型为 decltype 的参数调用 F 类型的值的结果的 Ts...。在这里,没有古怪的高级函数类型;一切都按照您自然期望的方式工作就我个人而言,我可能会在自己的代码中使用 decltype 方法,只是因为它更容易理解;但我想有些人会更喜欢 std::result_of 方法,因为它表面上看起来更简单,并且受到标准的祝福。给他自己的。:)

关于c++11 - Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of<F(Ts...)>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18778596/

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