我尝试在 C++ 11 中使用“简单”信号系统。我使用以下类: http://geekswithblogs.net/raccoon_tim/archive/2011/09/28/lambdas-and-events-in-c.aspx
但我有一个问题(我使用 Visual Studio 2012):
问题描述
我不能创建这样的事件:
RREvent1Arg<void> testEvent;
“void”不是参数类型!!
我尝试过“模板特化”,比如:
template<typename T1, typename T2> class Signaler {};
template<> class Signaler<T1> {};
template<> class Signaler<void> {};
但是我遇到了一些编译问题:
error C2065: 'T1' : undeclared identifier
谢谢你的帮助
最佳答案
答案 1:
这RREvent1Arg
您文章中的内容不是通用信号/插槽系统。它不是以通用的方式编写的。毫不奇怪,它没有被写入以适应 void
,就像它不处理除 1(给定名称)之外的许多参数也就不足为奇了。
请注意,它将回调处理程序定义为 typedef std::function<void (T1)> Func;
然后稍后尝试定义类似 void Call( T1 arg )
的东西.您不能在源代码中声明函数,如 void foo( void 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;
}
};
但这就是我。也许是 this
捕捉是很好的风格。似乎会给其他问题的人带来麻烦。
关于c++11 信号系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544135/