Не могу сохранить указатель на функцию c++ qt

у меня есть функция, которую надо сохранить в указателе. Работаю в QT, во время компиляции генерирует ошибку. Может кто помочь? Код следующий:

pclCloudFilter::pclCloudFilter(QObject *parent) : QObject(parent)
{
    void (*t_func)();
    t_func = &pclCloudFilter::custt;
}

void pclCloudFilter::custt()
{
    qDebug() << "class pclCloudFilter get clouds";
}

Ошибка которая сгенерирована


Ответы (1 шт):

Автор решения: Alex Guteniev

Если void pclCloudFilter::custt() не объявлена как static, то указатель на неё должен быть типа указатель на член-функцию, как уже ответил @KoVadim в комментарии:

void (pclCloudFilter::*t_func)();

Обычный указатель на функцию не годится, т.к. кроме явных параметров функции, в неё ещё неявно передаётся текущий экземпляр класса this. (void (*t_func)(pclCloudFilter*); тоже не подойдёт, this передаётся хитрее, чем просто параметр)

Указатель на член-функцию используется с операторами .* и ->*, вызов будет выглядеть так:

void (pclCloudFilter::*t_func)();
...
pclCloudFilter* inst = ...;
...
(inst->*t_func)();

Ужасная конструкция. Обычно с таким не имеют дело напрямую.

Используют:

  • std::mem_fn для превращения указателя на член-функцию в функтор
  • std::bind, std::bind_front, boost::bind тоже для превращения указателя на член-функцию в функтор, плюс для захвата this и/или другого контекста
  • лямбды - для коротких обёрток вызова члена-функции (при этом указатель на член-функцию вообще не нужен)
  • Обобщённый объект функции std::function или boost::function для хранения любого функтора со стиранием типа
  • сигналы Boost.Signals2, Qt slot/signals для реализации паттерна "обозреватель"
→ Ссылка