Я подозреваю, что это невозможно, но я думал, что попрошу. Скажем, у меня есть класс с методом:Динамически создайте указатель на функцию, вызывающий метод на данном экземпляре
class A {
public:
void b(int c);
};
я могу сделать указатель на эту функцию члена:
void (A::*ptr)(int) = &A::b;
(someAInstance.*ptr)(123);
Я могу также злоупотребляют указатели на функции и сделать указатель, который принимает A
аргумент непосредственно (Я не знаю, если это безопасно, но это работает на моей машине):
void (*ptr2)(A*, int) = (void (*)(A*, int))&A::b;
(*ptr2)(&someAInstance, 123);
то, что я хочу это как-то карри в A
и создать указатель на функцию, который принимает только int
, но вызывает метод A::b
для определенного экземпляра A
, который я предопредел. Экземпляр A
будет оставаться постоянным для этого конкретного указателя функции, но может быть несколько указателей на функции, указывающих на один и тот же метод A::b
, но с использованием разных экземпляров A
. Например, я мог бы сделать отдельную функцию обертки:
A* someConstantA = new A;
void wrapper(int c) {
someConstantA->b(c);
}
void (*ptr3)(int) = &wrapper;
Теперь я могу использовать ptr3
, не зная, какой именно A
это диспетчерская вызова, но я должен был определить специальную функцию, чтобы справиться с этим. Мне нужен способ сделать указатели на любое количество экземпляров A
, поэтому я не могу его жестко кодировать. Это возможно?
Редактировать: Должен ли я упомянул, я в ловушке в C++ 03 земли, а также не может использовать бустер
Должно быть это указатель на функцию? То, что вы хотите сделать, часто выполняется с использованием функциональных объектов (например, с помощью 'std :: bind'). – kennytm
@KennyTM Любое вызываемое произведение; Я не знаю 'std :: bind', теперь читаю –
^^^ или' boost :: bind', если у вас нет C++ 11. – AJG85