C++ 如何制作可复制的boost::signal?

C++ 如何制作可复制的boost::signal?,c++,boost-signals,noncopyable,C++,Boost Signals,Noncopyable,我知道为什么boost::signal是不可复制的(这是因为复制信号没有明确的含义),但我需要一个版本的信号,它确实提供某种类型的复制ctor(无操作或复制所有连接) 我之所以需要这样做,是因为在我的项目中,许多对象仅仅凭借特征信号就变得不可复制,为了用舒适的值语义来处理它们(共享的ptr没有那么舒适),我需要手动提供复制因子,而不是复制因子。显然,一种准可复制的信号将是解决C++在这里的丑陋的一个好办法 想到的第一个解决方案是继承signal,并在派生类中提供一个复制构造函数,但这是不可行的,

我知道为什么
boost::signal
是不可复制的(这是因为复制信号没有明确的含义),但我需要一个版本的信号,它确实提供某种类型的复制ctor(无操作或复制所有连接)

我之所以需要这样做,是因为在我的项目中,许多对象仅仅凭借特征信号就变得不可复制,为了用舒适的值语义来处理它们(共享的ptr没有那么舒适),我需要手动提供复制因子,而不是复制因子。显然,一种准可复制的信号将是解决C++在这里的丑陋的一个好办法

想到的第一个解决方案是继承
signal
,并在派生类中提供一个复制构造函数,但这是不可行的,因为signal没有虚拟dtor


想法?

您的信号不能有一个代理对象吗?代理将同时维护一个信号和一个引用计数。不要创建信号的副本,而是与代理对话,代理将依次增加/减少计数。这样行吗


您可能还需要参考该模式。

尝试在信号上保留指针(或共享指针),而不是信号。

不要派生。这是一个坏主意,对您没有任何好处-您的派生类也不可复制。不管您想要公开信号的哪一部分,也不管您想要实现哪一种行为,都可以使用您自己的类来实现,只需在幕后使用boost::signal即可

namespace Iraimbilanja {

// the copy constructor doesn't copy the signal, so it doesn't copy the connections...
struct EmptyOnCopySignal
{
private:
    boost::shared_ptr<boost::signal> _signal;
};

// the copy constructor references the same signal, so it copies the connections...
struct CopyableSignal
{
private:
    boost::shared_ptr<boost::signal> _signal;
};

} // namespace Iraimbilanja
namespace Iraimbilanja{
//复制构造函数不会复制信号,因此不会复制连接。。。
结构EmptyOnCopySignal
{
私人:
boost::共享的ptr信号;
};
//复制构造函数引用相同的信号,因此它复制连接。。。
结构可复制信号
{
私人:
boost::共享的ptr信号;
};
}//名称空间Iraimbilanja

我会选择在共享ptr内部保存信号。这样,您的对象将直接可复制,您可以使用值语义。

您肯定可以使用。这是本课程的主要目的。在boost的早期版本中,当线程无法复制时,也会使用它。唯一的缺点是信号可能在类之外进行管理,因此存储在所有复制类上的引用始终有效。

在共享ptr内部保存信号(默认情况下)将导致所有复制对象共享信号。触发一个对象中的信号将导致所有副本上连接到信号的每个插槽都收到通知。这可能不是您想要的行为


如果不希望发生这种情况,您可以编写自己的复制构造函数和复制赋值运算符,然后可以指定复制对象时希望发生的操作。

这很好,但是我如何将适当数量的参数转发给signalN::operator()()?将策略对象传递给代理,代理将转发合适的对象(如果有)。嗯,什么策略对象?例如,一个专门处理10个算术运算的转发器,在信号调用站点,为所需的argcount实例化?请参见不要使用该模式的字母,而是它的单词。复制信号的问题是,任何和所有
连接
对象都将引用旧信号。记住这一点!