Я пытаюсь передать функцию-член в качестве указателя на функцию, чтобы мне не нужно было полагаться на синглтоны или глобальные функции для обработки сообщений Qt в Qt 5. Насколько я могу судить, мой std::function является правильным type, у него правильная сигнатура, а bind должен позволять мне вставлять неявный указатель this
, фактически выдавая функцию-член за глобальную/не принадлежащую ему функцию.
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);
^
Я прочитал:
как передать функцию-член в качестве указателя на функцию?< /а>
Как передать указатель функции-члена?
Как передать функцию-член в качестве параметра функции, которая этого не ожидает?
Получить указатель функции из std::function при использовании std::bind а>
но ни один мне не помог.
ИЗМЕНИТЬ:
Итак, было сказано, что это невозможно без синглтона или глобальной функции... но почему? Единственная разница между функцией-членом и глобальной функцией с одинаковой сигнатурой заключается в том, что они не имеют одинаковую сигнатуру, а неявный указатель this
в качестве первого параметра функции-члена.
Зная это, почему я не могу использовать std::bind
для преодоления этого разрыва, говоря: «Я знаю, что вызываемая функция принимает аргумент this
перед всеми остальными, принудительно вставьте его туда, будьте той вещью, которая знает о this
. Это было бы намного чище, чем синглтон, а глобальная функция — просто дерьмо.
this
некуда впихивать. - person Chris Drew   schedule 15.09.2015std::function
не отслеживает это? У меня сложилось впечатление, чтоstd::bind
может связывать воедино разные вещи, отслеживая дополнительную информацию, например. указательthis
... - person Troyseph   schedule 15.09.2015std::function
может это отслеживать. НоqInstallMessageHandler
не принимаетstd::function
, он принимает указатель на функцию. - person Chris Drew   schedule 15.09.2015std::function
, которая при вызове передает дополнительную информацию о вызове ++ моей функции-члену? - person Troyseph   schedule 15.09.2015