Как я могу передать метод в качестве аргумента функции? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть код ниже, но он не скомпилируется, сообщая мне: «ошибка: недопустимое использование нестатической функции-члена».Есть ли способ передать такой метод в качестве аргумента функции, не делая его статическим?

class Base{
public:
    virtual int method() = 0;
}

class Derived1: public Base{
public:
    int method(){ return num; }
private:
    int num;
}

class Derived2: public Base{
public:
    int method(){ return dif_num; }
private:
    int dif_num;
}

template <class T>
int func( T obj, int(*f)() ){
    std::cout<<obj->f()<<std::endl;
}




int main(){
    Derived1* obj = new Derived1();
    func( obj, obj->method/*????*/ )
}

Заранее спасибо!

1 Ответ

0 голосов
/ 14 марта 2019
  1. Не используйте указатель на функцию. Вместо этого используйте std::function.
  2. Используйте лямбда-выражение в вызове func. Он будет преобразован в std::function компилятором.

1010 *
*

template <class T>
int func( T obj, std::function<int()>f ){
    std::cout<<obj->f()<<std::endl;
}

int main(){
    Derived1* obj = new Derived1();
    func( obj, [obj]() -> int {return obj->method();} )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...