Давайте предположим, что у нас есть следующий класс 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 ++, но в моем случае его нельзя использовать. Мне нужен реальный указатель на функцию, то есть генерировать код в реальном времени.
Вам не повезло, этого нельзя сделать удовлетворительным образом: единственное, что является точно указателем на 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);
// ...
Это единственный способ предоставить контекст простой функции через глобальные переменные.