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)
我强烈推荐Don Clugston出色的FastDelegate库.它提供了您对真实代表所期望的所有内容,并在大多数情况下编译为一些ASM指令.随附的文章也很好地阅读了成员函数指针.
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
归档时间: |
|
查看次数: |
28452 次 |
最近记录: |