Здравствуйте! Весь день пытаюсь разобраться с передачей аргументов в callback функцию.
Допустим, есть такой код:
#include <iostream>
void test(int a)
{
std::cout << a;
}
void callbackFunction(void(*cal)(int))
{
cal(5);
}
int main()
{
callbackFunction(test);
system("pause");
return 0;
}
Вопрос заключается в том, как сделать, чтобы можно было передавать абсолютно любые аргументы функции, а не только те, которые указаны void(*cal)(int), т.е. можно было вместо test передавать любую функцию с любым количеством аргументов любых типов.
Если так будет понятнее, к этой проблеме я пришел, когда хотел сделать таймер, которому нужно указать, какую функцию выполнять чтобы он выполнял бы её в нужное время.
Возможно ли это сделать? Может есть другие пути?
Не очень понятно, что именно вы хотите. Вот как примерный вариант -
#include <iostream>
using namespace std;
void f(int i)
{
cout << "f(" << i << ")\n";
}
void g(int i, int j)
{
cout << "g(" << i << "," << j << ")\n";
}
template<class Fn, class... Args>
void callback(Fn&& Fx, Args&&... A)
{
Fx(A...);
}
int main()
{
callback(f,5);
callback(g,1,2);
}
Но я не уверен, что это то, что вам нужно.
На практике проще всего ограничиться одним аргументом типа void *, который вы передаете вместе с адресом функции в callbackFunction(void(*cal)(void *), void *).
Именно его она и должна передать, вызывая ваш callback.
Т.е. этот аргумент указывает на данные, которые вы подготовите (скорее всего в динамической памяти) перед тем, как зарегистрируете свой callback. В принципе, размер указателя позволяет передавать в нем по крайней мере и unsigned int (если вашему callback этого достаточно для работы).
В качестве примера реализации такой идеи можно привести функцию on_exit
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости