【问题标题】:boost signals: Expose signal itself or connect / disconnect methods in class interface?增强信号:在类接口中公开信号本身或连接/断开方法?
【发布时间】:2013-09-20 16:44:12
【问题描述】:

当类中有信号时,将信号本身暴露在类“接口”中是否被认为是一种好习惯?

class MyClass
{
public:
    boost::signals2::signal<void()>& SomethingHappened()
    {
        return m_Signal;
    }

private:
    boost::signals2::signal<void()> m_Signal;
};

我见过有人写“注册”(可能还有“取消注册”)函数:

class MyClass2
{
public:
    boost::signals2::connection RegisterHandler(std::function<void()>& handler)
    {
        return m_Signal.connect(handler);
    }

private:
    boost::signals2::signal<void()> m_Signal;
};

我更喜欢第一种方法,因为我不想将我班级的用户限制在我提供的功能上。但是,是否有充分的理由偏爱第二种方法?

【问题讨论】:

    标签: c++ boost signals-slots boost-signals2


    【解决方案1】:

    第二个变体不太好:你不允许调用者使用信号的跟踪机制。

    但是,如果您将 function 替换为 your_signal::slot_type(或更好的事件,your_signal::extended_slot_type),它将提供比第一个变体更好的封装。特别是,它可以防止调用者误用(或滥用)m_Signal,如下所示:

    SomethingHappened().disconnect_all();
    

    【讨论】:

    • 这是一个不错的建议。这样,调用者可以在连接时开始跟踪,而不是显式断开连接。