Передать указатель нестатического метода в качестве аргумента другому методу

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

class foo
{
    void read(void (*func)(obj&))
    {
        // many things happen to obj...
        (*func)(obj);    // Calls the function pointer to the handler.
    }

};
class bar : public foo
{
    void handler(obj&)
    {
        // 
    }
};

void main()
{
    foo f;

    typedef void (foo::*funcptr)(obj&);
    funcptr ptr = &foo::handler;

    f.read(ptr);   ????
}

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

Я пробовал всевозможные способы заставить это работать и не хочу создавать статические методы (по причинам, в которые я не буду вдаваться). Я думаю, что я довольно близко, но как бы упал прямо в конце! Любая помощь будет оценена по достоинству.


person The Welder    schedule 09.05.2013    source источник
comment
Посмотрите FAQ lite, там есть отличный раздел, посвященный этому: parashift. com/c++-faq/pointers-to-members.html   -  person Constantin    schedule 09.05.2013
comment
Вам может быть интересно: stackoverflow.com/questions/55256301/ Или: stackoverflow.com/questions/55035470/   -  person Red.Wave    schedule 07.03.2020


Ответы (2)


Вы не можете этого сделать: в отличие от статических функций, которые можно вызывать сами по себе, вызов функции-члена требует знания двух вещей — вызываемой функции и объекта, для которого ее нужно вызвать. Вот почему невозможно передать функцию-член API, ожидая «простого» указателя на функцию.

Если у вас нет доступа к исходному коду класса foo, вы можете создать статическую функцию, которая вызывает функцию-член для объекта, хранящегося в известном месте (т. е. в статической переменной). Если вы это сделаете, рассмотрите возможность изменения API, чтобы он принимал объект функции, подобно тому, что делают функции из стандартной библиотеки C++.

Наконец, есть общий подход, используемый в библиотеках C, которые принимают указатели на функции - передача дополнительного указателя void*, который будет передан обратно при вызове вашего указателя на функцию; Это делает библиотека pthreads. Если это так, вы можете создать struct, который обертывает целевой объект вызова, и передать указатель на этот struct для передачи обратно в вашу статическую функцию.

person Sergey Kalinichenko    schedule 09.05.2013

AFAIK Я не думаю, что есть другой способ. Вам нужно будет сделать метод статическим.

person SNce    schedule 09.05.2013