完美的回调函数

The perfect callback function

目标:获得一个回调函数,可以接受任何类型的参数作为回调函数的参数

.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# 程序员

编辑:这不仅与错误有关,我很确定这不是我唯一犯的错误。

您的错误消息与 DelayedCallback

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

DelayedCallback(&HUDExit);

您显示的函数签名和用法不会产生一条错误消息

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

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

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

The non-deduced contexts are:
...
— A template parameter used in the parameter type of a function parameter that has a default argument that is being used in the call for which argument deduction is being done.

相反,您应该将 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 在 header 和源文件之间声明和定义函数模板,就像在 non-template 中一样。因此,像我上面所做的那样,在 header 本身中实现 ​​DelayedCallback