У меня есть метод шаблона с двумя параметрами имени типа (на самом деле это 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<void(QSpinBox::*)(int)>(QSpinBox::setValue)
. Это должно позволить работать выводу аргументов шаблона, поэтому вам не нужно указывать тип. - person NathanOliver   schedule 04.10.2016up_cast<>()
, который безопаснее (и также полезен для принуждения аргументов?:
без сужения). - person Toby Speight   schedule 04.10.2016