Использование указателей на член для передачи функции-члена в качестве аргументов - PullRequest
2 голосов
/ 26 февраля 2020
#include <iostream>
#include <functional>

class Foo 
{
    public:
    Foo(int value)
    : value_(value){}
    void print()
    {
        std::cout << "member print: " << value_ << std::endl;
    }
    int value_;
};

void print()
{
    std::cout << "stand alone print" << std::endl;
}

template<typename F>
void execute(F&& f)
{
    f();
}

int main()
{ 

    execute(print);

    Foo foo(5);

    auto binded = std::bind(&Foo::print,foo);
    execute(binded);

    //auto Foo::* foo_print = &Foo::print;
    //execute(foo.*foo_print);

}

Приведенный выше код компилируется и работает нормально.

Но если последняя часть, которая использует указатели на функцию-член print, не закомментирована, то компиляция завершится неудачно:

error: invalid use of non-static member function of type ‘void (Foo::)()’ 

Есть ли в коде синтаксическая ошибка или по какой-то причине это невозможно?

1 Ответ

3 голосов
/ 26 февраля 2020

Вы не можете передать функцию-член c, не относящуюся к состоянию, для выполнения, потому что она зависит от элемента this (и поэтому ему необходим объект вызова), вместо этого вы можете использовать lambda:

execute([&](){foo.print();});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...