如何基于“函数类似”参数推导出函数模板的返回类型?

时间:2018-03-07 09:59:22

标签: c++ templates

考虑以下功能模板:

template<typename A, typename B, typename Op>
B Apply(A a, Op f)
{
    return f(a);
}

要使用它,必须明确指定模板参数:

auto y = Apply<int, std::string>(2, [](int x){ return std::to_string(x); });

我想创建一个版本,其中参数由编译器推导出来,例如 我可以将其称为auto y = Apply(...);

1 个答案:

答案 0 :(得分:3)

应用仿函数的基本食谱解决方案:

  1. 使用转发参考。
  2. std::forward生活中的日常生活。
  3. decltype(auto)表示返回类型
  4. 我们可以使用它来将您的代码示例模拟为:

    template<typename F, typename A>
    decltype(auto) Apply(F&& f, A&& a) {
      return std::forward<F>(f)(std::forward<A>(a));
    }
    

    对于额外的调料,我们还可以提供例外规格:

    template<typename F, typename A>
    decltype(auto) Apply(F&& f, A&& a) 
      noexcept(noexcept(std::forward<F>(f)(std::forward<A>(a)))) {
      return std::forward<F>(f)(std::forward<A>(a));
    }