目标:获取一个回调函数,该函数将任何类型的参数作为回调函数的参数
.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
编辑:这不仅仅是关于错误,我很确定它不是我唯一的错误。
答案 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
。