完美的回调函数
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
。
目标:获得一个回调函数,可以接受任何类型的参数作为回调函数的参数
.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
。