Как передать аргументы в Callback функцию C++

190
23 февраля 2018, 18:32

Здравствуйте! Весь день пытаюсь разобраться с передачей аргументов в 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 передавать любую функцию с любым количеством аргументов любых типов.

Если так будет понятнее, к этой проблеме я пришел, когда хотел сделать таймер, которому нужно указать, какую функцию выполнять чтобы он выполнял бы её в нужное время.

Возможно ли это сделать? Может есть другие пути?

Answer 1

Не очень понятно, что именно вы хотите. Вот как примерный вариант -

#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);
}

Но я не уверен, что это то, что вам нужно.

Answer 2

На практике проще всего ограничиться одним аргументом типа void *, который вы передаете вместе с адресом функции в callbackFunction(void(*cal)(void *), void *).

Именно его она и должна передать, вызывая ваш callback.

Т.е. этот аргумент указывает на данные, которые вы подготовите (скорее всего в динамической памяти) перед тем, как зарегистрируете свой callback. В принципе, размер указателя позволяет передавать в нем по крайней мере и unsigned int (если вашему callback этого достаточно для работы).

В качестве примера реализации такой идеи можно привести функцию on_exit

READ ALSO
Заполнение массива с++

Заполнение массива с++

Как заполнить двумерный массив числами от 1 к 15 в разброс и что бы они не повторялисьМой вариант очень долгий

261
вывод массива после сортировки

вывод массива после сортировки

Допустим, если в векторе числа лежат числа 10 5 2, то сортировка выдаст мне 2 5 10Как сделать так, чтобы он мне вывел 3 6 11 без изменения самих чисел...

196
Как сделать подсчет очков в игре?

Как сделать подсчет очков в игре?

Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 40 очковПишу в Visual Studio 2017

417