我試圖通過一個函數指針的成員函數,以便我不需要依靠單例或全局函數來處理Qt 5中的Qt消息。據我可以告訴我的std ::函數是正確的類型,它有正確的簽名,綁定應該允許我在隱式指針中阻塞,實際上是將全局/非全部函數的成員函數傳遞出去。如何使用bind將成員函數作爲函數指針傳遞?
void ProgramMessageHandler::setAsMessageHandlerForProgram() {
std::function<void(QtMsgType, const QMessageLogContext &, const QString &)> funcPtr;
funcPtr = std::bind(handleMessages, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
qInstallMessageHandler(funkPtr);
}
這並不編譯。我可以成功地創建我funcPtr
變量,但它傳遞到qInstallMessageHandler
功能造成以下結果:
log\ProgramMessageManager.cpp:16: error: cannot convert 'std::function<void(QtMsgType, const QMessageLogContext&, const QString&)>' to 'QtMessageHandler {aka void (*)(QtMsgType, const QMessageLogContext&, const QString&)}' for argument '1' to 'void (* qInstallMessageHandler(QtMessageHandler))(QtMsgType, const QMessageLogContext&, const QString&)'
oldHandler = qInstallMessageHandler(hackedPointerToHandleFunction);
^
我已閱讀:
how to pass a member function as a function pointer?
How do you pass a member function pointer?
How to pass a member function as a parameter to a function that doesn't expect it?
Get function pointer from std::function when using std::bind
但沒有人幫助過我。
編輯:
所以有人說,這是不可能沒有一個單身或全局funtion ......但是爲什麼呢?成員函數和具有相同簽名的全局函數之間唯一的區別在於它們不具有相同的簽名,並且存在隱含的指針作爲成員函數的第一個參數。
知道了,爲什麼我不能用std::bind
彌合這一差距,說:「我知道,被調用的函數取this
參數中的所有其他人的面前,迫使它在那裏,是知道this
的東西。這比單身人士要乾淨得多,一個全球性的功能就是廢話。
函數指針(與函數對象不同)可以沒有自己的狀態,所以無處可在「this」指針中「卡住」。 –
@ChrisDrew但不是我的'std :: function'記錄它?我一直認爲'std :: bind'能夠通過跟蹤* extra *信息將不相同的東西綁定在一起,例如一個'this'指針... – Troyseph
是的,一個'std :: function'可以跟蹤它。但'qInstallMessageHandler'不需要'std :: function'它需要一個函數指針。 –