【问题标题】:Accepting lambda as function parameter and extracting return type [duplicate]接受 lambda 作为函数参数并提取返回类型
【发布时间】:2014-08-18 04:43:50
【问题描述】:

我需要接受 lambda 函数作为参数并找出它的返回类型。到目前为止,我想不出任何可行的方法。示例如下:

template <typename T1, typename T2>
T1 foo(T2 arg, std::function<T1(T2)> f)
{
    return f(arg);
}

...

int n = foo(3, [](int a){ return a + 2; });   <-- ERROR!

怎么做? Boost 解决方案也可以。

【问题讨论】:

    标签: c++ templates c++11 lambda


    【解决方案1】:

    您不应将std::function 作为参数传递。它有一些开销,因为它使用类型擦除来存储任何类型的可调用,例如函数指针、仿函数、lambdas(它们只是一个自动生成的仿函数)等。相反,您应该只模板化函数类型。然后您可以使用尾随返回类型来确定函数的返回类型:

    template <typename T, typename Function>
    auto foo(T arg, Function f) -> decltype(f(arg))
    {
        return f(arg);
    }
    

    【讨论】:

      【解决方案2】:

      std::function 和 lambda 不同,它们是不同的类型。前者是一个容器,可以存储任何类型的callable对象,而后者是一个callable对象。将 lambda 分配给 std::function 是可行的,因为 std::function 具有执行必要转换的构造函数。但是模板参数推导不是这种情况,它需要完全匹配,并且不考虑用户定义的转换。这就是您的代码无法编译的原因。

      解决方案很简单,正如 Rapptz 的 answer 所述,修改 foo 以将可调用对象作为模板参数。

      template <typename Arg, typename Func>
      auto foo(Arg arg, Func f)
          -> decltype(f(arg))
      {
          return f(arg);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 2022-01-16
        • 2015-04-11
        • 2020-04-24
        • 2021-03-29
        • 1970-01-01
        • 2015-09-04
        相关资源
        最近更新 更多