我尝试在C++ 11中使用“简单”信号系统。
但是我有一个问题(我使用Visual 2012):
问题描述
我不能创建这样的事件:
RREvent1Arg<void> testEvent;“空”不是一个参数类型!
我尝试使用“模板专门化”,类似于:
template<typename T1, typename T2> class Signaler {};
template<> class Signaler<T1> {};
template<> class Signaler<void> {};但我遇到了一些编译问题:
错误C2065:'T1‘:未声明的标识符
谢谢你的帮忙
发布于 2013-12-12 13:24:06
答案1:
本文中的这个RREvent1Arg不是一个通用的信号/时隙系统。它不是以一种广义的方式写的。不为适应void而编写它也就不足为奇了,正如它不处理1以外的一些参数(给定名称)也就不足为奇了。
注意,它将回调处理程序定义为typedef std::function<void (T1)> Func;,然后尝试定义类似void Call( T1 arg )的内容。您不能在源代码中声明像void foo( void arg )在C++中的函数,而且模板也不允许创建这些函数。有一些方法可以使用重载来修复这个问题,但是也有一些方法可以获取变量参数等等。
答案2:
我不太清楚如何使用lambda在"this“上的捕获特性,特别是当它被包装为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;
}
};但只有我一个人。也许this捕获是很好的风格。似乎会在其他问题上给人们带来麻烦。
发布于 2013-12-13 19:24:32
我编写了这个“简单信号库”,用于许多项目:
http://bitbucket.org/danielko/simplesignal
它不处理返回值的积累,因为我认为这种用例不足以保证额外的复杂性。
不过,它实现的是信号/插槽语义;当您连接时,您将得到一个需要保持生命的插槽,只要您希望接收来自该信号的通知。销毁时隙(或在其上调用disconnect() )将阻止将信号传递给时隙的所有者。
希望它足够简单易懂;各种模板处理任意数量的参数,不需要专门化。
https://stackoverflow.com/questions/20544135
复制相似问题