我想写一个'评估'将带有整数的未指定返回类型的函数作为输入的函数,以及用该函数调用该函数的整数。
我提出的是以下内容:
#include <functional>
template<typename T>
T eval(function<T(int)> f, int x) {
return f(x);
}
我想说我有一个auto func = [] (int x) -> long { return (long)x * x; }
我想用上面的函数评估。之前我使用模板函数的方式是简单地调用它,就像我任何其他函数一样,让编译器推断出类型。
但是,这不适用于此eval
函数。 eval<long>(func, 5)
编译并正常工作,但eval(func, 5)
不会:
Aufgaben10.5.cpp:23:25: error: no matching function for call to 'eval(main()::__lambda0&, int)'
cout << eval(func, 5) << endl;
^
Aufgaben10.5.cpp:23:25: note: candidate is:
Aufgaben10.5.cpp:8:3: note: template<class T> T eval(std::function<T(int)>, int)
T eval(function<T(int)> f, int x) {
^
Aufgaben10.5.cpp:8:3: note: template argument deduction/substitution failed:
Aufgaben10.5.cpp:23:25: note: 'main()::__lambda0' is not derived from 'std::function<T(int)>'
cout << eval(func, 5) << endl;
有没有办法编写一个与lambda函数具有相同返回类型的模板函数,而不将类型明确地传递给模板,这样我就可以简单地调用eval(func, 5)
?
答案 0 :(得分:8)
为什么不使用decltype
?
template<typename Function>
auto eval(Function&& f, int x) -> decltype(std::forward<Function>(f)(x))
{
return std::forward<Function>(f)(x);
}