1

我正在学习如何获取重载函数vstype的返回值。 test()test(double)

我从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;
}

我得到一个编译错误。

错误:“std::result_of”中没有名为“type”的类型

我认为:-

  • TestType<...>是“可变参数模板”。
    用我自己的话来说,它就像一个包含任意数量参数的压缩缩写。

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

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

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

我已经阅读了这些:-

线索:经过长时间的搜索,我闻到我的代码遭受“最令人烦恼的解析”的微弱气味。

4

1 回答 1

6

看看你的TestType<double>扩展是什么:

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

test(std::decvlal<double>)double这样你得到double(double)

result_of<double(double)>::type询问您是否可以double使用 type 的参数调用 a double

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

您需要阅读文档result_of以了解如何使用它。类型是使用参数result_of<F(Arg)>::type调用 an 的结果。如果可以使用参数调用,则获得返回类型,如果不能使用参数调用,则嵌套不存在。FArgFArgArgtype

所以这会起作用:

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

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

于 2017-02-16T09:34:19.110 回答