Идеальная функция обратного вызова
Цель: получить функцию обратного вызова, которая будет принимать параметры любого типа в качестве параметров функции обратного вызова.
.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#
РЕДАКТИРОВАТЬ: Это не только об ошибке, я уверен, что это не единственный, который я делаю.
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
}
Как только вы исправите все это, вы столкнетесь с проблемой, упомянутой в комментариях. Вы не можете разделить объявление и определение шаблона функции между заголовком и исходным файлом, как если бы вы использовали не шаблон. Так что реализуй DelayedCallback
в самом заголовке, как я сделал выше.