0

我正在学习如何获得type重载函数test()test(double)的返回值。“std :: result_of”中没有类型命名为“type”;从超载函数获得返回类型

我修改了代码a SO answer (by chris)

#include <type_traits> 
#include <utility> 

int test(); 
double test(double x); 

template<typename... Ts> 
using TestType = decltype(test(std::declval<Ts>()...))(Ts...); 

int main() { 
    std::result_of< TestType<double> >::type n = 0; 
    //^ ### compile error ### 
    using doubleDat = std::result_of< TestType<double> >::type ; 
    doubleDat n=0; 
} 

我有一个编译错误。

error: no type named 'type' in 'std::result_of'

据我了解: -

  • TestType<...>是 “可变参数模板”。
    用我自己的话说,它的行为如同一个包装的缩写,它有任何数量的参数。

  • TestType<double>idtest(double)函数。

  • std::result_of<TestType<double>>::typetest(double)的返回类型。
    doubleDat应该是double

问题:为什么不编译?如何解决它?

我已阅读这些: -

线索相关的问题:一个漫长的探索后,我得到我的代码遭受的微弱气味“最令人头疼的解析”。

回答

4

看看你的TestType<double>扩展为:

test(std::declval<double>())(double) 

test(std::decvlal<double>)double等你拿double(double)

result_of<double(double)>::type询问是否可以用double类型的参数调用double

答案是否定的,因为double不可调用,所以没有嵌套类型。

您需要阅读result_of的文档以了解如何使用它。 result_of<F(Arg)>::type类型是调用F并带有参数Arg的结果。如果F可用参数Arg进行调用,则返回类型为Arg,如果该参数不可调用,则嵌套的type不存在。

所以这会工作:

using func_type = TestType<double>; 
using doubleDat = std::result_of<func_type*(double)>::type; 

这对于TestType<double>类型(即double(double))的函数创建一个别名,然后询问是否可以用的参数调用一个指针类型(即double(*)(double))键入double。你可以,所以你的type是有效的。

+0

刚刚在试验后写我自己的答案。你击败了我。 –

+0

我想要善于处理这些事情。 (我正在慢慢地从试验和错误中学习)。如何在一个大块中获得关于这个领域的丰富知识?有没有书,例如哪一个在[一本C++书籍SO链接](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)中,深入讨论了这些主题?教程视频?你写一些C++书籍吗? – javaLover

+3

[在21天内自学C++](http://abstrusegoose.com/249) –