Идеальная функция обратного вызова

Цель: получить функцию обратного вызова, которая будет принимать параметры любого типа в качестве параметров функции обратного вызова.

.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 в самом заголовке, как я сделал выше.

Другие вопросы по тегам