Динамическое создание указателя на функцию, который вызывает метод для данного экземпляра

Подозреваю, что это невозможно, но решил спросить. Скажем, у меня есть класс с методом:

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и создать указатель на функцию, который просто принимает an 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, поэтому я не могу жестко запрограммировать его таким образом. Это как-то возможно?


Изменить: Должен был упомянуть, что я застрял в земле С++ 03, а также не могу использовать Boost

5
задан Michael Mrozek 2 April 2012 в 19:56
поделиться