C++11 <;F(Ts…)>;在安德烈·亚历山德雷斯库';让我们来谈谈分解元组

C++11 <;F(Ts…)>;在安德烈·亚历山德雷斯库';让我们来谈谈分解元组,c++11,tuples,C++11,Tuples,有人看过Andrei Alexandrescu在2013年GoingNative2013中关于爆炸元组的演讲吗 下面是我不太明白的一段代码: template <class F, class... Ts> auto explode(F&& f, const tuple<Ts...>& t) -> typename result_of<F(Ts...)>::type { return Expander<size

有人看过Andrei Alexandrescu在2013年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);
}
模板
自动分解(F&F、常量元组和t)
->typename结果_of::type
{
返回扩展器::扩展(f,t);
}
F(Ts…)的结果给我带来了很多麻烦。我的意思是:F不是代表函数类型吗? 我知道R(Ts…),但是这里的R是一个返回类型,但是在R应该在的地方使用F,这让我疯狂

有人能帮我理解这里奇怪的F(Ts…)吗

以下是Andrei Alexandrescu演讲的链接:

你想问的问题可能是这个问题的重复:

让我们剖析一下:

std::result_of<F(Ts...)>::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_所期望的类型是,真的!,该函数类型包含在另一个函数类型中。详细说明:

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);
正如@Simple在注释中所写的那样,
std::result\u of::type
总是可以用不太聪明但也不太容易混淆的表达式替换

decltype( std::declval<F>() ( std::declval<Ts>()... ) )
decltype(std::declval()(std::declval()…)

i、 e。,“调用带有
Ts类型参数的
F
类型值的结果的
decltype
。这里没有古怪的高级函数类型;一切都按照你自然期望的方式进行。就我个人而言,我可能会在自己的代码中使用
decltype
方法,只是因为它更容易理解;但我想有些人会更喜欢
std::result\u的
approach,因为它表面上看起来更简单,而且受到标准的支持。各自为政

有关
result\u of
及其公认的时髦语法的更多信息,请参阅。仅供参考:Stephan T.Lavavej在最后五分钟的演讲中解释了如何正确实现
explode
result\u of::types
表示使用
Ts
类型的参数调用
F
类型对象的返回类型。如果您理解
decltype
,那么它类似于
decltype(std::declval()(std::declval()…)
typedef int F(char);
std::result_of<F(char)>;  // fails to compile
decltype( std::declval<F>() ( std::declval<Ts>()... ) )