c++函数成员指针
c++ Function member pointer
我读过几篇关于这方面的文章,但似乎找不到我想要的示例代码。如果有人能给我一些帮助,我将不胜感激。
在我的标题中,我有:
void addEvent(void (*func)(Pack *));
void triggerEvents(Pack * );
std::list<void(*)(Pack *)> eventList;
和在cpp文件中
void DNetwork::addEvent(void (*func)(Pack *)){
eventList.push_back(func);
}
void DNetwork::triggerEvents(Pack * pack){
for (std::list<void (*)( Pack *)>::iterator it = eventList.begin(); it != eventList.end() ;it++ ){
(*it)(pack);
}
}
这对自由函数来说很好,但当我试图将成员函数添加到此列表时,我会遇到错误。有人知道如何在指针中存储成员函数(来自随机类对象)吗?
简单的解决方案是对函数/函数指针类型使用类型擦除,更简单的方法是使用std::function<>
:
std::list<std::function<void (Pack*)>;
然后,您可以使用自由函数或成员函数(通过std::bind
将成员函数与要调用它的对象绑定)甚至函数对象(提供operator()
的类型)初始化function
对象。
对于成员函数,您需要绑定。成员函数是一个"正常函数",它具有类的隐式参数。所以你需要一个活页夹。如果您使用c++11,您可以使用std::bind和std::函数,或者您可以对非c++11代码使用boost::bind和boost::函数。
typedef std::function< void ( Pack* ) > MyFunction;
void addEvent( MyFunction f );
void triggerEvents( Pack* );
std::list< MyFunction > eventList;
void DNetwork::addEvent( MyFunction f )
{
eventList.push_back( f );
}
void DNetwork::triggerEvents( Pack *pack )
{
for ( auto it = eventList.begin(); it != eventList.end(); it++ )
{
(*it)(pack);
}
}
现在,如果我有方法doA( Pack* )
的类A,我会写:
A a;
Pack pack;
DNetwork d;
d.addEvent( std::bind( &A::doA, &a, &pack ) );
或者更好的是,你可以使用Boost.Signal,或者你可以使用发布者/子订阅模式
编辑正如@DavidRodríguez dribeas所建议的:绑定不应该采取&pack参数,因为成员函数的参数是在triggerEvents中的调用位置提供的。正确的方法是:
A a;
Pack pack;
DNetwork d;
d.addEvent( std::bind( &A::doA, &a, std::placeholders::_1 ) );
d.triggerEvents( &pack );
您可以进行过载,例如:
std::list<void(*)(Pack *)> eventList;
void addEvent(void (*func)(Pack *));
template<typename T>
void addEvent(void (T::*func)(Pack *));
namespace Abstraction {
template<typename T>
void abstractlyAddEvent( T, std::list<void(*)(Pack *)> *eventList );
}
如果我理解您的问题,那么当您尝试在addEvent中将函数添加到列表中时,会出现错误吗?
如果要添加指向类的非静态成员函数的指针,请确保它具有正确的语法。。。例如,TestClass中指向成员函数的函数指针看起来像:
void * (TestClass:: *) ()
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队