首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11信号系统

c++11信号系统
EN

Stack Overflow用户
提问于 2013-12-12 12:52:51
回答 2查看 1.1K关注 0票数 0

我尝试在C++ 11中使用“简单”信号系统。

但是我有一个问题(我使用Visual 2012):

问题描述

我不能创建这样的事件:

代码语言:javascript
复制
RREvent1Arg<void> testEvent;

“空”不是一个参数类型!

我尝试使用“模板专门化”,类似于:

代码语言:javascript
复制
template<typename T1, typename T2> class Signaler {};
template<> class Signaler<T1> {};
template<> class Signaler<void> {};

但我遇到了一些编译问题:

错误C2065:'T1‘:未声明的标识符

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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时。因为这很让人困惑,所以我建议将它保存到另一个局部变量中,并按值捕获:

代码语言:javascript
复制
static RREvent1Arg<int> testEvent;
class MyClass
{
 int a;
 void MyMethod()
 {
   MyClass *mc = this;
   testEvent += [=mc](int) { mc->SignalReceived(); };
 }

 void SignalReceived()
 {
   this->a = 10;
 }
};

但只有我一个人。也许this捕获是很好的风格。似乎会在其他问题上给人们带来麻烦。

票数 1
EN

Stack Overflow用户

发布于 2013-12-13 19:24:32

我编写了这个“简单信号库”,用于许多项目:

http://bitbucket.org/danielko/simplesignal

它不处理返回值的积累,因为我认为这种用例不足以保证额外的复杂性。

不过,它实现的是信号/插槽语义;当您连接时,您将得到一个需要保持生命的插槽,只要您希望接收来自该信号的通知。销毁时隙(或在其上调用disconnect() )将阻止将信号传递给时隙的所有者。

希望它足够简单易懂;各种模板处理任意数量的参数,不需要专门化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20544135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档