完美的回调功能

时间:2015-06-04 16:37:35

标签: c++ templates c++11 function-pointers perfect-forwarding

目标:获取一个回调函数,该函数将任何类型的参数作为回调函数的参数

.h
template <typename F, typename A>
void DelayedCallback(F&& CallbackFunction, A&& Args = NULL);

/

.cpp
void DelayedCallback(F&& CallbackFunction, A&& Args)
{
  //Timer function that received a function pointer to be the "callback"  function
  Timer((std::bind(std::forward<F>(CallbackFunction), std::forward<A>(Args)))())
}

/

DelayedCallback(&HUDExit);

void HUDExit() {}

/

ERROR : DelayedCallback(FName,float,F &&,A &&)' : could not deduce template argument for 'A'

我做错了什么?我对c ++中的大部分概念都很陌生,更多的是c#programmer

编辑:这不仅仅是关于错误,我很确定它不是我唯一的错误。

1 个答案:

答案 0 :(得分:1)

您的错误消息与DelayedCallback

的签名不符
template <typename F, typename A>
void DelayedCallback(F&& CallbackFunction, A&& Args = NULL)

DelayedCallback(&HUDExit);

该功能签名和您显示的用法不会产生错误消息

  

错误:DelayedCallback(FName,float,F &&,A &&)':无法推断'A'

的模板参数

但忽略模板参数不匹配,您显示的代码也会导致类似的错误。问题是模板参数不能从默认参数中推导出来,A被视为示例中的非推导上下文。

来自N3337,§14.8.2.5/ 5 [temp.deduct.type]

  

未推断的背景是:
  ...
   - 在函数参数的参数类型中使用的模板参数,该参数具有在正在进行参数推断的调用中使用的默认参数。

相反,您应该将A更改为参数包。这将允许您将零个或多个参数传递给DelayedCallback

template <typename F, typename... A>
void DelayedCallback(F&& CallbackFunction, A&&... Args)
{
  //Timer function that received a function pointer to be the "callback"  function
  Timer((std::bind(std::forward<F>(CallbackFunction), std::forward<A>(Args)...))())
  // previous line is missing a semicolon at the very least
}

一旦解决了所有这些问题,您将遇到评论中提到的问题。您cannot split在标头和源文件之间声明和定义函数模板,就像使用非模板一样。因此,如上所述,在标题中实现DelayedCallback