Вставить указатель на функцию в QMap (Qt)

Я создаю своего рода маршрутизатор для REST API в Qt, и я сталкиваюсь с проблемой вставки указателя функции в QMap.

у меня урок IModule из которого получены другие модули.
Важные черты IModule.h являются

typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);

class IModule : public QObject
{
Q_OBJECT

protected:
QMap<QString , IBusAction > *m_actions;

Тогда у меня есть UserModule который получен из IModule И в .cpp файл у меня есть такие строки:

QByteArray* UserModule::create(IBus *bus, ProxyRequest *req)
{
}

QByteArray* UserModule::show( IBus *bus, ProxyRequest *req)
{
}UserModule::UserModule(QObject *parent) :
IModule(parent)
{

// register functions
m_actions->insert("show", &UserModule::show);
m_actions->insert("create", UserModule::create);

}

Итак, я попробовал два варианта, как поместить функцию в QMap со ссылочным знаком также без нее, но оба не работают. Я получаю ошибку: no matching function for call to 'QMap<QString, QByteArray* (*)(IBus*, ProxyRequest*)>::insert(const char [5], QByteArray* (UserModule::*)(IBus*, ProxyRequest*))'

Я провел несколько часов с этой проблемой, пробовал много разных способов ее решения, но успеха не было.

Поэтому я буду очень рад за любой совет.

1

Решение

Ваш IBusAction тип указателя на функцию Это несовместимо с функцией указателя на член.

Когда вы вызываете функцию-член (например, ваш UserModule::create функция), ему нужен дополнительный («невидимый») параметр: экземпляр, на который вызывается функция ( this указатель).

У вас есть три основных варианта:

  • + Изменить IBusAction быть указателем на член-функцию-из-UserModule, Вы ограничены функциями этого класса с этим, хотя.

    typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
    
  • Сделать функции static (это меняет семантику вашего кода)

  • Используйте автономные функции (верхнего уровня, а не члены класса) вместо функций-членов.
2

Другие решения

Указатели на функции-члены в C ++, как правило, доставляют больше хлопот, чем они того стоят. Разумная альтернатива — иметь класс вместо метода и хранить указатель на экземпляр вместо метода.

Специфичной альтернативой Qt является использование вызываемых методов класса, основанного на QObject, который вы можете вызывать по имени строки, используя QObject :: invokeMethod, обходя многие проблемы типов.

0

По вопросам рекламы [email protected]