c++ - 这是使用 boost 信号的正确和适当的方法吗?

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

我正在创建一个 MVC 应用程序,我希望模型能够将输出文本发送到要显示的 GUI。

一些人推荐了函数指针,但我现在了解到,如果你传递一个成员函数的函数指针,你还必须传递一个指向对象的指针(为什么不只传递对象指针以便调用方法在上面?)

无论如何,我也被推荐使用 boost::signals2。我已经实现了一个非常简单的工作示例。我基本上将信号绑定(bind)到 GUI 对象的函数。然后将指向信号的指针传递给可以触发信号的对象。请参阅下面的代码...

struct GUI
{
    void talk()
    {
        cout << "hello" << endl;
    }
};

class Person {
public:
    Person(){}
    Person(const signal<void ()>* sig) : sig(sig){}
    virtual ~Person(){}

    void testSig()
    {
       (*sig)();
    }


private:
    const signal<void ()>* sig;
};

int main() {
    boost::signals2::signal<void ()> sig;
    GUI gui;
    sig.boost::signals2::connect(boost::bind(&GUI::talk, &gui));

    Person tom(&sig);
    tom.testSig();
}

由于我是信号的初学者,所以我不确定我是否按预期使用它们。

最佳答案

为什么不把 signal 放在 person 类中? 你可以这样做:

struct GUI
{
    void talk() {
        cout << "hello" << endl;
    }
};

class Person {
    boost::signals2::signal<void ()> sig_;
public:
    Person() {}
    virtual ~Person() {}

    template <typename F>
    void connect(F f) {
        sig_.connect(f);
    }

    void testSig() {
       sig_();
    }
};

int main()
{
    GUI gui;
    Person tom;

    tom.connect(boost::bind(&GUI::talk, &gui));
    tom.testSig();
}

关于c++ - 这是使用 boost 信号的正确和适当的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055313/

相关文章:

c++ - 如何从模板签名创建 boost::function

c++模板复制构造函数不可用或显式

c++ - 返回 NULL 但出现错误 C2440 : 'return' : cannot convert from 'int' to 'const &'

c++ - 如何显示实时输出 SFML

c++ - 从其处理程序或处理程序 dtor 中销毁 boost::asio 计时器是否安全?

c++ - 在没有其他 boost 的情况下使用 boost 模块?

c++ - vc++如何读取包含\uxxxx的文件

c++ - Boost 编译标志 gcc 错误

c++ - boost::signals::scoped_connection 在 std::vector 中不起作用。为什么?

c++ - 是否可以向 `boost::signal`添加一些条件