考虑 C++11 中的以下函数:
template<class Function, class... Args, typename ReturnType = /*SOMETHING*/>
inline ReturnType apply(Function&& f, const Args&... args);
我想ReturnType
等于f(args...)
我必须写什么而不是/*SOMETHING*/
?
考虑 C++11 中的以下函数:
template<class Function, class... Args, typename ReturnType = /*SOMETHING*/>
inline ReturnType apply(Function&& f, const Args&... args);
我想ReturnType
等于f(args...)
我必须写什么而不是/*SOMETHING*/
?
我认为你应该使用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.
}
请注意,如果您传递args
asArgs&&...
而不是 const Args&...
,那么最好使用std::forward
as f
:
decltype(f(std::forward<Args>(args)...))
当你使用const Args&...
, thenstd::forward
没有多大意义(至少对我来说)。
最好通过args
称为通用参考并Args&&...
与之一起使用。std::forward
它不需要是模板参数,因为它不用于重载解析。尝试
template<class Function, class... Args>
inline auto apply(Function&& f, const Args&... args) -> decltype(f(std::forward<const Args &>(args)...));
在某些情况下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
}