Здравствуйте! Весь день пытаюсь разобраться с передачей аргументов в 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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как заполнить двумерный массив числами от 1 к 15 в разброс и что бы они не повторялисьМой вариант очень долгий
Допустим, если в векторе числа лежат числа 10 5 2, то сортировка выдаст мне 2 5 10Как сделать так, чтобы он мне вывел 3 6 11 без изменения самих чисел...
Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 40 очковПишу в Visual Studio 2017