如何确定C ++ lambda的结果类型(Closure Type)

时间:2014-12-27 05:18:27

标签: c++ lambda functional-programming c++14

我试图编写一个与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

1 个答案:

答案 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();
}