C++函数指向对象的指针

goo*_*ons 0 c++ pointers member-function-pointers function-pointers functor

我不确定这在C++中是否可行.我知道你可以将指向函数或静态成员函数的指针作为参数传递.我想要一个特定对象的函数指针,这样当函数执行时,它就在对象上完成.

class MyClass
{
   public:
      MyClass(int id){mId = id;}
      void execute(){cout<<mId<<endl;}
   private:
      int mId;
};


MyClass obj1(1);
MyClass obj2(2);

typedef (Executor)();
Executor ex1 = &obj1::execute();
Executor ex2 = &obj2::execute();
Run Code Online (Sandbox Code Playgroud)

因此,当执行ex1时,应打印"1",如果执行ex2,则打印"2".这可能吗?

eca*_*mur 9

处理此问题的工具是功能模板bind:

auto ex1 = std::bind(&MyClass::execute, obj1);
Run Code Online (Sandbox Code Playgroud)

您可以在function对象中存储绑定:

std::function<void()> ex1 = std::bind(&MyClass::execute, obj1);
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下bind将按obj值存储; 你可以存储一个引用ref:

std::function<void()> ex1 = std::bind(&MyClass::execute, std::ref(obj1));
Run Code Online (Sandbox Code Playgroud)

一个相关的工具是mem_fn,它包装了一个成员函数指针:

void (MyClass::*ex1)() = &MyClass::execute;  // raw member function pointer
ex1(obj1);

auto ex1 = std::mem_fn(&MyClass::execute);   // mem_fn wrapper
ex1(obj)
Run Code Online (Sandbox Code Playgroud)

但是,因为mem_fn不绑定实例,所以每次调用它时都必须提供实例.


为了避免在绑定成员函数时编写类名,可以使用宏:

#define BIND_MEM_FN(o,m) \
    std::bind(&std::remove_reference<decltype(o)>::type::m, (o))
Run Code Online (Sandbox Code Playgroud)

宏是必需的,因为您只能从其类型和名称形成成员函数指针,并且您不能将名称(非限定ID)传递给函数.