C++成员函数指针,Boo::信号

C++成员函数指针,Boo::信号,c++,member-function-pointers,boost-signals,C++,Member Function Pointers,Boost Signals,我有以下情况,代码更好 class Foo { private: typedef boost::signal<void ()> Signal; Signal signal; public: void Register_SignalFunction(const Signal::slot_type& slot); void Unregister_SignalFunction(const Signal::sl

我有以下情况,代码更好

    class Foo
    {
private:
       typedef boost::signal<void ()> Signal;
       Signal signal;

public:
       void Register_SignalFunction(const Signal::slot_type& slot);
       void Unregister_SignalFunction(const Signal::slog_type& slot);
    }

    class OtherFoo
    {
       Foo foo;
public:
       OtherFoo()
       {
            foo.Register_SignalFunction(&OnSignal)    //I know I can't do this that is precisely my question.
       }

       void OnSignal();  //what to do when signal fires
     }  

所以问题是,我如何将“成员函数”指针传递给Register方法。还有,这样可以吗?我想要/需要的是某种代表注册系统,因此如果没有人能为我指明正确的方向,我将不胜感激。Thanx。通常,您可以:

void Register_SignalFunction(const boost::function<void()> &slot) {
    signal += slot;
}
或者,作为内联函数:

template<typename T>
void Register_SignalFunction(T &slot) {
    signal += slot;
}

后者可能通过移除boost::function所具有的间接层来稍微提高效率,但前提是boost::signal不在内部使用boost::function,而它可能在内部使用boost::function。因此,请选择您喜欢的选项。

您通常会使用boost-bind:

foo.Register\u SignalFunctionboost::bind和OtherFoo::OnSignal,this

这是怎么回事-

信号的连接方法采用函子。这是一个实现运算符的对象。bind接受指向自由函数或成员函数的函数指针,并返回具有正确签名的函子

另请参见此处:

在这里:

要断开信号连接,请将返回值从连接存储到:

boost::signals::connection

然后调用断开连接的方法。

我在尝试了很多次之后,它开始工作,下面是代码:

GraphicsDeviceManager
{
  private:
      typedef boost::signal<void ()> DeviceLost;
      DeviceLost deviceLost;

  public:
      Register_DeviceLostHandler(const boost::function<void ()> &handler)
      {
          deviceLost.connect(slot);
      }
      Unregister_DeviceLostHandler(const boost::function<void ()> &handler)
      {
          //deviceLost.disconnect(slot); 
      }
}

class GameBase
{
  private:
    GraphicsDeviceManager* graphics;

   public:
       GameBase()
       {
          graphics = new GraphicsDeviceManager();
          graphics->Register_DeviceLostHandler(boost::bind(&GameBase::OnDeviceLost, this));
       }
       void OnDeviceLost()
       {
           //do some stuff
       }
}
这段代码正常工作,但有一个例外,如果我取消注释deviceLost.disconnecthandler语句,我会收到如下编译错误: 错误C266 boost::operator==:4重载具有类似的转换


那么,为什么会发生这种情况?你知道我尝试的其他方法吗?

如果有人想要一个完整的例子:

#include <iostream>
#include <boost/signals2/signal.hpp>
#include <boost/bind.hpp>
#include <boost/optional/optional_io.hpp>

#define registerEvent_(A)   registerEvent(boost::bind(A, this, _1, _2))

struct A
{
    typedef boost::signals2::signal<int (int &, int &)> EventSignal;
    typedef EventSignal::slot_type SlotType;

    void registerEvent(const SlotType & slot);
    void triggerAll(int& a1, int& a2);

    EventSignal signal_;
};

void A::registerEvent(const SlotType & slot) { signal_.connect(slot); }
void A::triggerAll(int& a1, int& a2) {std::cout << signal_(a1, a2) << "\n";}

struct B : public A
{
    B();
    int myFunc(int& a1, int& a2);
};

B::B() {
#ifdef WITHMACRO
    registerEvent_(&B::myFunc);
#else
    registerEvent(boost::bind(&B::myFunc, this, _1, _2));
#endif
}
int B::myFunc(int& a1, int& a2) { return a1 + a2 + 1; }

int main()
{
    int a1 = 2;
    int a2 = 3;
    B b;
    b.triggerAll(a1, a2);
}

每当我尝试像foo.Register\u SignalFunctionboost::bind和OtherFoo::OnSignal这样的操作时,就会出现这个错误;错误C2678:二进制“==”:未找到接受类型为“const boost::slot”的左手操作数的运算符,或者没有可接受的转换f:\development\boost\u 1\u 41\u 0\boost\function\u equal.hpp 17 1 Indigen_Framework@Yoss当前位置我认为您的信号类型必须公开。除此之外,请发布一个最小的可编译示例。您当前的代码中有拼写错误,例如:Signal::slog_type…Ps:如果您看到拼写错误,很抱歉,我键入了代码,我没有从Visual Studio复制/粘贴。您不会这样断开连接。您的寄存器函数应该返回boost::signals::connection,然后使用它断开连接。请参阅我的答案和Boost signals文档。