4

考虑 C++11 中的以下函数:

template<class Function, class... Args, typename ReturnType = /*SOMETHING*/> 
inline ReturnType apply(Function&& f, const Args&... args);

我想ReturnType等于f(args...) 我必须写什么而不是/*SOMETHING*/

4

3 回答 3

14

我认为你应该使用trailing-return-type重写你的函数模板:

template<class Function, class... Args> 
inline auto apply(Function&& f, const Args&... args) -> decltype(f(args...))
{
    typedef decltype(f(args...)) ReturnType;

    //your code; you can use the above typedef.
}

请注意,如果您传递argsasArgs&&...而不是 const Args&...,那么最好使用std::forwardas f

decltype(f(std::forward<Args>(args)...))

当你使用const Args&..., thenstd::forward没有多大意义(至少对我来说)。

最好通过args称为通用参考Args&&...与之一起使用。std::forward

于 2013-01-03T18:07:32.703 回答
4

它不需要是模板参数,因为它不用于重载解析。尝试

template<class Function, class... Args> 
inline auto apply(Function&& f, const Args&... args) -> decltype(f(std::forward<const Args &>(args)...));
于 2013-01-03T18:07:34.830 回答
0

在某些情况下std::result_of更有用。例如,假设您要传递此函数:

int ff(int& out, int in);

并在 apply() 内部这样称呼它

int res;
f(res, args...);

那么我就不知道如何使用 decltype,因为我手头没有 int lvalue 引用。使用 result_of,您不需要变量:

template<class Function, class... Args> 
typename std::result_of<Function(const Args&...)>::type apply(Function&& f, const Args&... args)
{
  typedef typename std::result_of<F(const Args&...)>::type ReturnType;

  // your code
}
于 2018-12-03T14:32:57.550 回答