从Boost signals2信号调用的仿函数的成员变量不会更新

时间:2014-09-25 21:28:34

标签: c++ boost signals-slots functor

我希望以下完整程序输出数字42,但输出0。为什么呢?

#include <iostream>
#include <boost/signals2/signal.hpp>

class TestFunctor {
public:
    TestFunctor() : last_received_value(0) {}
    void operator()(const int& i) {
        last_received_value = i;
    };

    int last_received_value;
};

int main(int argc, char* argv[]) {
    TestFunctor f;
    boost::signals2::signal<void(const int& i)> sig;
    sig.connect(f);
    sig(42);
    std::cout << f.last_received_value << std::endl;
    return 0;
}

如果main()被以下内容替换,我会得到预期的输出42

int main(int argc, char* argv[]) {
    TestFunctor f;
    f(42);
    std::cout << f.last_received_value << std::endl;
    return 0;
}

我怀疑问题是TestFunctor实例的副本实际上正在连接到信号。我该如何防止这种情况(或甚至可能)?

1 个答案:

答案 0 :(得分:2)

您需要通过ref注册回调:

sig.connect(boost::ref(f));

否则,插槽会获得仿函数f的副本,并且副本会更新。