我试图创建一个具有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)
答案 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;
}