Могу ли я по умолчанию первый параметр шаблона?

У меня есть метод шаблона с двумя параметрами typename (это на самом деле QObject::connect() — увидеть этот ответ а также другой ответ). Поскольку типовые имена относятся к указателям на элементы, дедукция может завершиться ошибкой, если переданное имя ссылается на перегруженную функцию; когда это происходит, нам нужно либо привести один аргумент к правильному типу (возможно, сохранив его в локальной переменной нужного типа), либо квалифицировать вызов одним или несколькими параметрами шаблона.

Возьмем пример из одного из связанных вопросов:

QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);

должен быть написан как

QObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);

или (по принуждению):

void(QSpinBox::*signal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, signal,
slider, &QSlider::setValue);

Иногда, однако, первый аргумент шаблона может быть выведен, но требуется более поздний. Есть ли простой способ по умолчанию первый параметр, но указать другие? Я думал о чем-то вроде

QObject::connect<auto, void(QSpinBox::*)(int)>(slider, &QSlider::valueChanged,
spinBox, &QSpinBox::setValue);

Очевидно, что это недопустимый C ++, но я надеюсь, что это иллюстрирует суть.

Я знаю, что могу написать

void(QSpinBox::*slot)(int) = &QSpinBox::setValue;
QObject::connect(slider, &QSlider::valueChanged,
spinBox, slot);

но я надеюсь на более сжатый синтаксис.

1

Решение

Есть ли простой способ по умолчанию первый параметр, но указать другие?

Нет. Вам просто придется принудительно ввести второй аргумент, как с помощью static_cast:

QObject::connect(slider, &QSlider::valueChanged,
spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::setValue));

Или просто используйте другую перегрузку connect() и передать лямбду:

QObject::connect(slider, &QSlider::valueChanged,
[&spinBox](int i){ spinBox.setValue(i); });
7

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector