Это в основном для очистки кода от моего конструктора. У меня есть около 20+ строк connect(object, func1, this, func2)
в одном конструкторе, и я пытаюсь очистить код с помощью std::vector<std::tuple<QObject*,std::function<void()>,std::function<void>>>> connections;
. Было бы неплохо, если бы я мог сделать что-то вроде:
std::vector<std::tuple<QObject*,std::function<void()>,std::function<void>>>> connections = {
std::make_tuple(mySlider, std::bind(&QSlider::sliderReleased,mySlider, std::bind(&Foo::onSliderChanged,this)),
.
.
.
};
И затем вызвать его так:
for(auto &&e : connections)
connect(std::get<0>(e),std::get<1>(e),this,std::get<2>(e));
Однако, когда я делаю это, я получаю сообщение об ошибке, что возникает ошибка замещения и std::function<void()>
не может быть преобразован в функцию указатель. Поэтому решите изменить его и создать фактические указатели на функции, подобные следующему:
typename void(Foo::*fooFunc)();
typename void(QSlider::*sliderFunc)();
std::vector<std::tuple<QObject*,sliderFunc,fooFunc>> sliderConnections = {
std::make_tuple(mySlider, &QSlider::sliderReleased, &Foo::onSliderChanged),
.
.
.
};
И то же самое, я затем попытаюсь вызвать его:
for(auto &&e : sliderConnections)
connect(std::get<0>(e),std::get<1>(e),this,std::get<2>(e));
Однако это также обеспечивает аналогичное ошибка, когда нет конверсий. Что не имеет никакого смысла, потому что теперь я на самом деле использую указатель на функцию. Который согласно документации по подключению должен иметь возможность взять указатель функции для их соединения. Так что либо я передаю это неправильно. Или то, что я пытаюсь достичь, невозможно.
Любая помощь будет оценена!