gpt4 book ai didi

c++11 信号系统

转载 作者:行者123 更新时间:2023-11-28 07:13:56 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com