考虑以下功能模板:
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(...);
答案 0 :(得分:3)
应用仿函数的基本c++14食谱解决方案:
std::forward
生活中的日常生活。decltype(auto)
表示返回类型我们可以使用它来将您的代码示例模拟为:
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));
}