c++11 信号系统

标签 c++ events c++11 lambda signals

我尝试在 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/

相关文章:

c++ - 如何在启动阶段捕获屏幕(当 Autochk 运行时)?

android - 错误 :(49) undefined reference to 'cv::Stitcher::createDefault(bool)' in using OpenCV native in Android

c# - 将自定义 EventArgs 作为事件参数传递

c++ - Variadic 模板递归返回类型推导编译错误

c++ - 被隐式删除,因为默认定义的格式不正确 :

c++ - 关于右值引用的一些说明

c++ - decltype(rvalue expr) 的类型推导规则是什么?

C++ Win32 通过 to_wstring 将零填充到 int

Android ListView如何获取空 View 事件

javascript - 加载当前脚本时执行脚本