Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;11信号系统 我试图用C++ 11使用一个简单的信号系统。我使用以下类: _C++_Events_C++11_Lambda_Signals - Fatal编程技术网

c++;11信号系统 我试图用C++ 11使用一个简单的信号系统。我使用以下类:

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

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

问题描述

我无法创建这样的事件:

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编译。不支持可变模板!