具有公共基类到std :: function的通用对象

时间:2017-07-02 11:06:47

标签: c++

我试图创建一个具有Qt启发界面的信号处理类,如此

class MessageConsumer {};

class MessageHandler {
public:
  static int Connect(int, MessageConsumer* obj, std::function<void(MessageConsumer&)> handler) { 
    // Add callback to handler 
    }      
};

class A : public MessageConsumer {
public:
  void handleIt(void) {
    // Do stuff
  }
};

int main(void) {
  A a;
  MessageHandler::Connect(1, &a, &A::handleIt);
  return 0;
}

但不断收到编译错误

main.cpp:在函数“int main()”中: main.cpp:71:46:错误:没有匹配的函数“MessageHandler :: Connect(int,A *,void(A :: )())”    MessageHandler :: Connect(1,&amp; a,&amp; A :: handleIt);                                               ^ main.cpp:53:5:anm:candidate:static int MessageHandler :: Connect(int,MessageConsumer ,std :: function)  int MessageHandler :: Connect(int,MessageConsumer * obj,std :: function handler){      ^ ~~~~~~~~~~~~~ main.cpp:53:5:anm:参数3从“void(A :: *)()”到“std :: function”没有已知的转换

有没有办法在不定义模板的情况下解决这个错误,我不想在界面中使用模板,即

MessageHandler::Connect<A>(1, &a, &A::handleIt)

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,最简单的方法是使用lambda函数:

MessageHandler::Connect(1,&a, [](MessageConsumer& a) 
    { static_cast<A&>(a).handleIt(); });

请参阅完整编译示例live

#include <functional>

class MessageConsumer {
};

class MessageHandler {
public:
  static int Connect(int, MessageConsumer* obj,  
                     std::function<void(MessageConsumer&)> handler) { 
        // Add callback to handler 
        return 0;
    }      
};

class A : public MessageConsumer {
public:
  void handleIt() {
    // Do stuff
  }
};

int main(void) {
  A a;
  MessageHandler::Connect(1,&a, [](MessageConsumer& a) 
      { static_cast<A&>(a).handleIt(); });
  return 0;
}