gpt4 book ai didi

c++ - 如何使用来自boost的模板相关信号成员实现模板类?

转载 作者:太空狗 更新时间:2023-10-29 22:52:47 26 4
gpt4 key购买 nike

我尝试实现一个模板类,它需要一个依赖于模板参数的信号成员。我的第一个想法是像下面这样实现它:

template<class T>
class SignalClass
{
typedef boost::signals2::signal<void (T &)> OnReceive;

public:
SignalClass(const OnReceive::slot_type &_slot)
{
m_onReceive.cnnect(_slot);
}
virtual SignalClass(){};

void Send(T &_val)
{
m_onReceive(_val);
}
private:
OnReceive m_onReceive;
};

该类应该像这样使用:

class SignaledClass
{
public:
SignaledClass(void)
{
SignalClass<int> var1(boost::bind(&SignaledClass::ReceiveINT, this));
SignalClass<double> var2(boost::bind(&SignaledClass::ReceiveDOUBLE, this));
}

void ReceiveINT(int &_val)
{
...
}

void ReceiveDOUBLE(double &_val)
{
...
}
}

(顺便说一句:我知道,在构造函数内部创建 SignalClass 对象是没有意义的。这只是为了理解我的问题。)

用模板作为信号参数实现类似委托(delegate)的概念对我来说很重要。

问题是构造函数代码不起作用。

但我找到了解决方案。

如果我另外指定一个额外的 typedef 就像

typedef typename OnReceive::slot_type slot_type;

并将其用作构造函数的参数,例如

PushInputSlot(const slot_type& _slot);

它起作用了。但我不知道为什么。

我希望有人能帮助我。

谢谢,弗兰克

P.S.:我是 stackoverflow 的新手,所以我不熟悉这里的规则。希望我以正确的方式完成了所有事情...;-)...

最佳答案

这是添加 typename(直接在构造函数参数中或在附加的 typedef 中)起作用的原因:

首先,OnReceive 类型是所谓的“依赖类型”,因为它依赖于模板参数的类型。

然后,模板在编译器中分两个阶段进行处理:第一阶段是编译器遇到模板的源文本时,第二阶段是实际实例化模板时。在处理的第一阶段,编译器将(应该)尝试尽可能地验证模板定义是否正确,但在涉及到依赖类型时会遇到问题。因为依赖类型依赖于模板参数,所以编译器不知道实际类型会是什么样子。
特别是,当使用 :: 运算符访问一个成员时,编译器需要一些帮助来决定该成员是指一个成员类型(typedef 或嵌套类)还是一个非类型成员(变量、枚举等)。如果您知道它应该引用一个类型,可以通过在(完整)类型名称之前添加 typename 来解决这个问题。
编译器可能有问题的另一个地方是在小于比较中区分成员模板和非模板成员。这可以通过在成员模板名称前(紧跟在运算符之后)添加关键字 template 来解决。

关于c++ - 如何使用来自boost的模板相关信号成员实现模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652790/

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