在特定对象实例上调用C++函数指针

fry*_*bob 13 c++ pointers function

我有一个函数指针定义:

typedef void (*EventFunction)(int nEvent);
Run Code Online (Sandbox Code Playgroud)

有没有办法用特定的C++对象实例处理该函数?

class A
{
private:
    EventFunction handler;

public:
    void SetEvent(EventFunction func) { handler = func; }

    void EventOne() { handler(1); }
};

class B
{
private:
    A a;
public:
    B() { a.SetEvent(EventFromA); }  // What do I do here?

    void EventFromA(int nEvent) { // do stuff }
};
Run Code Online (Sandbox Code Playgroud)

编辑: Orion指出了Boost提供的选项,例如:

boost::function<int (int)> f;
X x;
f = std::bind1st(
      std::mem_fun(&X::foo), &x);
f(5); // Call x.foo(5)
Run Code Online (Sandbox Code Playgroud)

不幸的是Boost对我来说不是一个选择.是否有某种"currying"函数可以用C++编写,它会将指向成员函数的指针包装到普通函数指针中?

Ori*_*rds 11

远离原始C++函数指针,std::function而是使用它.

boost::function如果您使用的是旧版编译器,例如不支持C++ 11的visual studio 2008,则可以使用.
boost:function并且std::function是相同的 - 他们在C++ 11的std库中提取了相当多的增强功能.

注意:您可能希望阅读boost函数文档而不是microsoft文档,因为它更容易理解


Dav*_*ron 11

您可以使用函数指针索引到给定对象实例的vtable.这称为成员函数指针.您的语法需要更改为使用".*"和"&::"运算符:

class A;
class B;
typedef void (B::*EventFunction)(int nEvent)
Run Code Online (Sandbox Code Playgroud)

然后:

class A
{
private:
    EventFunction handler;

public:
    void SetEvent(EventFunction func) { handler = func; }

    void EventOne(B* delegate) { ((*delegate).*handler)(1); } // note: ".*"
};

class B
{
private:
    A a;
public:
    B() { a.SetEvent(&B::EventFromA); } // note: "&::"

    void EventFromA(int nEvent) { /* do stuff */ }
};
Run Code Online (Sandbox Code Playgroud)


Ron*_*lic 9

我强烈推荐Don Clugston出色的FastDelegate库.它提供了您对真实代表所期望的所有内容,并在大多数情况下编译为一些ASM指令.随附的文章也很好地阅读了成员函数指针.

http://www.codeproject.com/KB/cpp/FastDelegate.aspx


Ono*_*cci 5

您可能会发现Marshall Cline 的 C++ 常见问题解答对您想要实现的目标很有帮助。