Соединение указателя и указателя на член в указатель на функцию

Пожалуйста, рассмотрите такой код:

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 сейчас устарела).

1

Решение

Вы не можете получить простой указатель на функцию, но вы можете получить объект функции, используя 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)> если ты хочешь.

2

Другие решения

Вы не можете создать указатель на функцию из указателя на член и указателя на объект. То, что вы можете получить, это объект функции с той же нотацией вызова, например, std::bind():

std::bind(member_func_ptr, class_ptr, _1)

Вы можете использовать этот функциональный объект для инициализации, например, std::function<void(int)>,

1

По вопросам рекламы [email protected]