c++;11信号系统 我试图用C++ 11使用一个简单的信号系统。我使用以下类:
但我有一个问题(我使用Visual Studio 2012): 问题描述 我无法创建这样的事件:c++;11信号系统 我试图用C++ 11使用一个简单的信号系统。我使用以下类: ,c++,events,c++11,lambda,signals,C++,Events,C++11,Lambda,Signals,但我有一个问题(我使用Visual Studio 2012): 问题描述 我无法创建这样的事件: RREvent1Arg<void> testEvent; rrevent1argtestevent; “void”不是参数类型 我尝试过“模板专门化”,例如: template<typename T1, typename T2> class Signaler {}; template<> class Signaler<T1> {}; templat
RREvent1Arg<void> testEvent;
rrevent1argtestevent;
“void”不是参数类型
我尝试过“模板专门化”,例如:
template<typename T1, typename T2> class Signaler {};
template<> class Signaler<T1> {};
template<> class Signaler<void> {};
模板类信号器{};
模板类信号器{};
模板类信号器{};
但我遇到了一些编译问题:
错误C2065:“T1”:未声明的标识符
谢谢你的帮助回答1: 本文中的
RREvent1Arg
不是通用信号/插槽系统。它不是用一般的方式写的。毫不奇怪,它的编写并不是为了适应void
,正如它不处理除1(给定名称)之外的许多参数一样,也毫不奇怪
注意,它将回调处理程序定义为typedef std::function Func
然后尝试定义类似于无效调用(T1 arg)
的内容。在C++中,不能在源代码中声明函数,如代码>虚空FO(无效ARG)< /C>,并且模板也不允许创建这些函数。有一些方法可以使用重载来解决这个问题,但也有一些方法可以获取变量参数,等等
答案2:
我不确定在“this”上使用lambda的捕获功能的规则是什么,特别是如果它被包装成std::function
。因为它让人困惑,我建议将其保存到另一个局部变量中,并通过值捕获它:
static RREvent1Arg<int> testEvent;
class MyClass
{
int a;
void MyMethod()
{
MyClass *mc = this;
testEvent += [=mc](int) { mc->SignalReceived(); };
}
void SignalReceived()
{
this->a = 10;
}
};
static RREvent1Arg testEvent;
类MyClass
{
INTA;
void MyMethod()
{
MyClass*mc=这个;
testEvent+=[=mc](int){mc->SignalReceived();};
}
接收无效信号()
{
这个->a=10;
}
};
但那只是我。也许这个
捕获是很好的风格。似乎会在其他问题上给人们带来问题。我写了这个“简单信号库”,我在很多项目中使用它:
它不处理返回值的累积,因为我不认为用例是足够普通的,以保证额外的复杂性。
它实现的是信号/插槽语义;当您连接时,您会得到一个插槽,只要您想接收信号通知,它就需要保持活动状态。销毁插槽(或调用插槽上的disconnect()
)将停止向插槽所有者发送信号
希望它足够简单易懂;变量模板可以处理任意数量的参数,无需专门化。向我们展示一些我们可以尝试编译的代码。除非您已经承诺使用这个“简单”的信号系统,否则我建议您使用更普遍的(经过尝试和测试的)库,如boost signals2。我已经修复了问题2,这是一个“完全重新编译”问题谢谢你的评论。。。我刚刚写的。我很无聊。非常感谢,问题是VS2012不支持可变模板:-(仅供参考,您可以在lambda中捕获
此
,但它只能通过值捕获,而不能通过引用捕获。最大的风险是您必须保证指针至少在lambda仍然存在的情况下保持有效。感谢HostileFork,我同意您的观点,我的目标是对其进行一点改进。第一步是处理“void”后来处理程序处理了几个参数……但对于这两个参数,它们都不知道如何处理?@Spectral如果你真的想编写一个信号和插槽库,有很多方法可以攻击它。如果你想沿着RREvent
和RREvent
的道路前进,你可以研究一下。你还可以定义一个function类型,然后将您的信号槽机制设计为参数化。可能最好先研究和使用其他人设计的内容,不过……是的,但Visual Studio 2012不支持可变模板:-(@Spectral)您应该提出一个新问题,而不是进行编辑,因为编辑会使现有答案看起来毫无意义。请将此问题作为新问题提问,然后转到第4版。(有一个“回滚”按钮)。非常感谢Daniel,问题是它没有使用Visual Studio 2012编译。不支持可变模板!