Пожалуйста, рассмотрите такой код:
class MyClass{
public:
void MyFunc(int x){
std::cout << x << std::endl;
}
};
int main(){
MyClass* class_ptr = new MyClass();
void (Myclass::*member_func_ptr)(int) = &MyClass::MyFunc;
// This should output '5'.
(class_ptr->*member_func_ptr)(5);
/* ??? */
// I want the following to output '5' exactly the same way as previous call.
func_ptr(5);
}
Как я должен завершить этот код, чтобы иметь func_ptr(...)
позвонить в MyFunc от *class_ptr
?
Если это возможно, я хотел бы как-то присоединиться MyClass*
и void (Myclass::*)(int)
в void (*)(int)
.
Если нет, я ожидаю умного использования std::mem_fn
а также std::function
(или другие функциональные утилиты) могут сделать свое дело.
В идеале я хотел бы решение C ++ 11 (так как, например, std::mem_fun
сейчас устарела).
Вы не можете получить простой указатель на функцию, но вы можете получить объект функции, используя bind
или лямбда:
auto bound = std::bind(member_func_ptr, class_ptr, std::placeholders::_1);
auto lambda = [=](int x){return (class_ptr->*member_func_ptr)(x);}
bound(5); // should output 5
lambda(5); // should output 5 too
Оба из них могут быть преобразованы в std::function<void(int)>
если ты хочешь.
Вы не можете создать указатель на функцию из указателя на член и указателя на объект. То, что вы можете получить, это объект функции с той же нотацией вызова, например, std::bind()
:
std::bind(member_func_ptr, class_ptr, _1)
Вы можете использовать этот функциональный объект для инициализации, например, std::function<void(int)>
,