1

请考虑这样的代码:

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

如果可能的话,我很想以某种方式将 aMyClass*和 a加入void (Myclass::*)(int)到 avoid (*)(int)中。

如果没有,我希望巧妙地使用std::mem_fnand std::function(或其他功能实用程序)可能会成功。

理想情况下,我想要一个 C++11 解决方案(因为std::mem_fun现在不推荐使用 eg)。

4

2 回答 2

2

你不能得到一个普通的函数指针,但你可以使用bindlambda 或 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)>如果您愿意,这两个都可以转换为。

于 2013-08-04T14:43:35.373 回答
1

您不能从成员指针和对象指针创建函数指针。您可以获得的是具有相同调用符号的函数对象,例如std::bind()

std::bind(member_func_ptr, class_ptr, _1)

您可以使用这个函数对象来初始化,例如,一个std::function<void(int)>.

于 2013-08-04T14:43:13.477 回答