Как создать метод на объекте для передачи его в виде обратного вызова в стиле C?

Давайте предположим, что у нас есть следующий класс A:

class A
{
public:
void sum(int x);
};

И у нас есть функция f, который получает обратный вызов в стиле C с одним параметром типа int и называет это:

typedef void (*Callback)(int);

void f(Callback cb)
{
cb(5);
}

Есть ли способ в C ++, чтобы карри метод A::print на объекте типа A и передать его функции f? Что-то вроде этого:

void main()
{
A a;
auto curry_a = ??; // something like curry_a = [&](int x) { a.sum(x) };
f(curry_a);
}

std::bind и лямбда-функции не являются решением, потому что они создают объекты типа std::function<> с перегрузкой operator(), Это выглядит как карри в C ++, но в моем случае его нельзя использовать. Мне нужен реальный указатель на функцию, то есть генерировать код в реальном времени.

1

Решение

Вам не повезло, этого нельзя сделать удовлетворительным образом: единственное, что является точно указателем на C-совместимую функцию, — это функция (или функция класса, но не функция экземпляра).

Итак, вам нужно создать функцию, которая фиксирует параметр, например this функции-члена. Единственный способ установить этот параметр — через глобальную переменную:

A *instance;
void (A::*a_fun)(int);
void applicator(int arg) { instance->*a_fun(arg); }
//...
int main() {
A a;
instance = &a;
a_fun = &A::sum;
f(applicator);
// ...

Это единственный способ предоставить контекст простой функции через глобальные переменные.

2

Другие решения