C++11 <;F(Ts…)>;在安德烈·亚历山德雷斯库';让我们来谈谈分解元组
有人看过Andrei Alexandrescu在2013年GoingNative2013中关于爆炸元组的演讲吗 下面是我不太明白的一段代码: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
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>()... ) )