C++ 使用boost.signals2如何将动态分配的对象连接到信号
我有一个名为C++ 使用boost.signals2如何将动态分配的对象连接到信号,c++,boost,boost-signals2,C++,Boost,Boost Signals2,我有一个名为Candidate的类,其中包含一个名为DataUpdate()的函数。我打算动态创建多个候选实例,并让每个实例将其函数DataUpdate()作为插槽连接到boost.signals2信号;准备接收信号 我在下面开发的代码给出了错误: 错误2错误C2276:“&”:对绑定成员函数表达式的操作非法 我不确定实现预期结果的正确代码。问题似乎在于取消引用指针candidateInstance,以获取要传递给signal.connect()的实例的DataUpdate()函数的地址。有人能
Candidate
的类,其中包含一个名为DataUpdate()
的函数。我打算动态创建多个候选实例,并让每个实例将其函数DataUpdate()
作为插槽连接到boost.signals2
信号;准备接收信号
我在下面开发的代码给出了错误:
错误2错误C2276:“&”:对绑定成员函数表达式的操作非法
我不确定实现预期结果的正确代码。问题似乎在于取消引用指针candidateInstance
,以获取要传递给signal.connect()
的实例的DataUpdate()
函数的地址。有人能告诉我正确的方法吗
Candidate *candidateInstance;
//INSTANTIATE CANDIDATE INSTANCE
++DataStream::ID;//increment static variable
candidatesVector.push_back(candidateInstance = new Candidate(ID));
//CONNECT DATAUPDATE() OF CANDIDATE INSTANCE
signal.connect( &((*candidateInstance).DataUpdate) );
//FIRE SIGNAL
signal(BarNumber(), DateTime(), Open(), High(), Low(), Close());
您应该使用
bind
为成员函数创建包装器
#include <iostream>
#include <memory>
#include <functional>
#include <boost/signals2.hpp>
class Foo
{
public:
void foo()
{
std::cout << "I'm foo() from Foo, this == " << this << std::endl;
}
};
int main()
{
auto foo_ptr = std::make_shared<Foo>();
boost::signals2::signal<void()> sig;
sig.connect(std::bind(&Foo::foo, foo_ptr));
sig();
return 0;
}
#包括
#包括
#包括
#包括
福班
{
公众:
void foo()
{
std::cout所以我尝试使用您建议的格式,但这一行是signal.connect(std::bind(std::mem_fn(&Candidate::DataUpdate),candidateInstance.get());给出错误;错误C2064:术语不适用于包含6个参数的函数。如何修复它?谢谢。@看起来您的函数的参数比我的答案中表示的函数多。在这种情况下,您应该使用。bind
不需要mem\u fn
,并且可以绑定到shared\u ptr
:
@很快,谢谢你让我走上正轨,让代码像这样编译和运行://实例化候选实例++数据流::ID;//增加静态变量以给出唯一的ID号。候选*候选实例实例=新候选(ID,iDataNumber);//连接候选实例信号的DATAUPDATE().CONNECT(绑定(&CANDIDATE::DATAUPDATE,candidateInstance,_1,_2,_3,_4,_5,_6,_7));//火灾信号(iDataNumber,BarNumber(),DateTime(),Open(),High(),Low(),Close());
@GoFaster,很高兴它有帮助:)