请考虑以下代码:
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(...)
从*class_ptr
调用MyFunc?
如果有可能,我希望以某种方式加入MyClass*
和void (Myclass::*)(int)
加入void (*)(int)
。
如果没有,我希望巧妙地使用std::mem_fn
和std::function
(或其他功能实用程序)可以解决问题。
理想情况下,我喜欢C ++ 11解决方案(因为例如std::mem_fun
已被弃用)。
答案 0 :(得分:2)
您无法获得普通函数指针,但您可以使用bind
或lambda获取函数对象:
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)>
。
答案 1 :(得分:1)
您无法从成员指针和对象指针创建函数指针。您可以获得的是具有相同调用符号的函数对象,例如使用std::bind()
:
std::bind(member_func_ptr, class_ptr, _1)
您可以使用此函数对象进行初始化,例如std::function<void(int)>
。