我试图编写一个与std::function
或lambda一起使用的模板函数。让我们假设apply
模板如下:
template<typename F>
typename F::result_type apply(const F &f) {
return f();
}
如果我用std::function<int()>
调用它,这很好,但是如果用[]() -> int { return 1; }
调用它,则不行,因为lambda的闭包类型没有result_type
1}}成员。那么如何编写apply
的返回类型以使其正常工作?
我目前正在使用clang 3.5和C ++ 14,但无论我得到什么,如果它都是可移植的,那么它是最好的 - 我很乐意切换到更新的编译器如果那样有帮助。
实际示例有点复杂。我尝试编写像reduce
这样的东西,如果第一个参数是可调用的,它会将参数应用于可调用的,否则它将忽略参数并返回作为第一个参数传递的值。
reduce(0, 1, 2); // returns 0
reduce([](int a, int b) { return a+b; }, 2, 3); // return 5
答案 0 :(得分:3)
对于C ++ 14,您应该使用decltype(auto)
。
template<typename F>
decltype(auto) apply(const F &f) {
return f();
}
对于pre-C ++ 14,您可以使用Boost.FunctionTypes
中的result_type
。
template<typename F>
typename boost::function_types::result_type<F>::type apply(const F &f) {
return f();
}