当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在特定对象实例上调用C++函数指针》经验,为你挑选了3个好方法。

我有一个函数指针定义:

typedef void (*EventFunction)(int nEvent);

有没有办法用特定的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 }
};

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

boost::function f;
X x;
f = std::bind1st(
      std::mem_fun(&X::foo), &x);
f(5); // Call x.foo(5)

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



1> Orion Edward..:

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

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

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



2> David Citron..:

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

class A;
class B;
typedef void (B::*EventFunction)(int nEvent)

然后:

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 */ }
};



3> Ron Warholic..:

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

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

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有