У меня есть метод шаблона с двумя параметрами 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);
но я надеюсь на более сжатый синтаксис.
Есть ли простой способ по умолчанию первый параметр, но указать другие?
Нет. Вам просто придется принудительно ввести второй аргумент, как с помощью 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); });
Других решений пока нет …