Передача указателя функции вместо функции слота

При попытке сделать что-то вроде этого:

connect(process1, SIGNAL(waitForReadyRead()), this, SLOT(dataReceived_1()));

у меня слишком много процессов для сигналов. Я создал QList со всеми этими процессами (объектами).

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

Что-то вроде этого:

for(int i=0; i<procList.length(); ++i){
   connect(procList[i], SIGNAL(waitForReadyRead()), this, SLOT(data_rcvd[i]));
}

Здесь data_rcvd — это QList, содержащий функции слотов.~ но, к сожалению, мы не можем добавлять функции внутри QList. Итак, я хочу знать, есть ли возможность определить указатели функций для выполнения этой задачи???

Или вы думаете, что я создаю новый класс QProcess (расширяю) и перегружаю функцию waitForReadyRead() для выдачи указателя, содержащего эту конкретную информацию?


person johny bravo    schedule 23.07.2019    source источник
comment
Чем отличаются слоты для каждого процесса? Почему бы вам не подключить сигналы от всех процессов к одному слоту?   -  person vahancho    schedule 23.07.2019
comment
Есть ли у вас постоянный набор методов/функций, которые служат слотами? Всегда ли соотношение 1:1? А о скольких мы говорим?   -  person tomdol    schedule 23.07.2019
comment
@tomdol да, их 1-1 и около 20 из них.   -  person johny bravo    schedule 23.07.2019


Ответы (1)


Список может не содержать функций, но может содержать указатели на функции. Итак, объявите список указателей на функции. В выражениях указатели функций неявно преобразуются в указатели на типы функций. Указатели - это объекты.

Вот демонстрационная программа, использующая стандартный контейнер std::list.

#include <iostream>
#include <list>

long long sum( int x, int y ) { return ( long long )x + y; }
long long multiply( int x, int y ) { return ( long long )x * y; }

int main()
{
    std::list<long long( * )( int, int )> lst = { sum, multiply };

    for ( const auto &p : lst ) std::cout << p( 10, 2 ) << '\n';
}

Его вывод

12
20
person Vlad from Moscow    schedule 23.07.2019
comment
Можете ли вы привести пример для этого? - person johny bravo; 23.07.2019
comment
спасибо, в целом все работает нормально, но когда я определяю функцию в классе (не статическом), она не компилируется. Я всегда получаю эту ошибку: должна быть вызвана ссылка на нестатическую функцию-член. Я не могу определить функцию как слоты, если объявить их глобально. Любая идея? - person johny bravo; 23.07.2019
comment
@johnybravo Используйте вместо аргумента шаблона список, например std::function. - person Vlad from Moscow; 23.07.2019
comment
Я все еще учусь, не могли бы вы дать некоторое представление? Хотя это и не идеально, но один обходной путь, как я вижу, если я объявлю функцию-член статической, она сработает. Поскольку у меня будет только один экземпляр класса, делающий это, в худшем случае я просто использую эту технику, а затем - person johny bravo; 23.07.2019
comment
@johnybravo Как я уже упоминал, вы можете использовать std;:function. - person Vlad from Moscow; 23.07.2019