Предположим, что следующая ситуация:
Введите A
и введите B
, B
можно неявно преобразовать в A
, но противоположное неверно.
У меня есть функция
template<class T>
void do_stuff(T a, T b);
Я хочу вызвать указанную функцию как таковую:
do_stuff(A{}, B{});
Проблема заключается в том, что компилятор не может вывести тип и вместо этого говорит:
template argument deduction/substitution failed
Я могу вызвать свою функцию следующим образом:
do_stuff<A>(A{}, B{});
Но это более раздражает пользователя.
В качестве альтернативы я могу сделать что-то вроде этого:
template<class T, class M>
void do_stuff(T a, M b);
Но тогда b продолжает веселиться, чтобы быть типа B (с предыдущим вызовом).
В идеале мне бы хотелось что-то вроде:
template<class T, class M = T>
void do_stuff(T a, M b);
Или:
template<class [email protected] MAGIC SO THAT T IS DEDUCED AS BEING THE TYPE OF ARGUMENT NR [email protected]>
void do_stuff(T a, T b);
Возможно ли это?