2017-07-02 44 views
0

我試着去創建這樣與普通基類通用對象爲std ::功能

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; 
} 

Qt的啓發接口的信號處理類,但不斷收到編譯器錯誤

main.cpp中:在函數「int main()」: main.cpp:71:46:錯誤:無匹配函數MessageHandler :: Connect(int,A *,void(A :: )())「 MessageHandler :: Connect 1,& a,& 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: :函數」

有沒有解決這個錯誤沒有定義模板的方式,我不想在界面中使用的模板,即

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

* 「我不想在界面中使用模板」 * - 爲什麼不呢? –

+0

如何使用['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind)? –

+0

唯一的原因是我希望它看起來儘可能多Qt儘可能 – Johan

回答

0

正如評論最簡單的W¯¯提到ay是使用λ函數:

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; 
}