"std::result_of" 中没有名为 "type" 的类型;从重载函数中获取 return 类型

no type named "type" in "std::result_of" ; get return type from overloading functions

我正在学习如何获取重载函数 test()test(double) 的 return 值的 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'

据我了解:-

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

我读过这些:-

线索: 经过长时间的搜索,我隐约闻到我的代码有问题 "Most vexing parse".

看看你的 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 是使用参数 Arg 调用 F 的结果。如果 F 可以用参数 Arg 调用,你会得到 return 类型,如果它不能用参数 Arg 调用,那么嵌套的 type 不会存在。

所以这会起作用:

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

这为类型为 TestType<double>(即 double(double))的函数创建别名,然后询问您是否可以使用参数调用指向该类型(即 double(*)(double))的指针类型 double。你可以,所以你 type 是有效的。