#function #c 11 #methods #arguments
#функция #c 11 #методы #аргументы
Вопрос:
У меня есть приведенный ниже код, но он не будет компилироваться, сообщая мне: «ошибка: недопустимое использование нестатической функции-члена». Есть ли способ передать такой метод в качестве аргумента функции, не делая его статичным?
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:
- Не используйте указатель на функцию. Вместо этого используйте
std::function
. - Используйте лямбда-выражение при вызове
func
. Компилятор преобразует его вstd::function
.
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();} )
}