Можно ли указывать только некоторые параметры шаблона при вызове шаблона функции и позволить компилятору выводить другие - PullRequest
1 голос
/ 25 февраля 2020

Рассмотрим следующий шаблон функции:

template <typename T1, typename T2>
void foo(T1 a, T2 b){// Do something.}

Теперь предположим, что я хочу, чтобы T1 было int, но компилятор выводил T2 в зависимости от типа b , Что-то вроде foo<int,...>(1,b). Возможно ли это?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Да!

foo<int>(1, b);

Но в приведенном выше примере нет никакой выгоды. Разница видна, если ваш первый аргумент еще не будет выведен в int:

foo<int>(3.2f, b);
//       ^^^^ Implicit conversion
0 голосов
/ 25 февраля 2020

Ответ от Квентина наиболее удобен.

Но есть и другой способ решить проблему, чтобы придумать очевидный. Поскольку принудительное указание типа шаблона c приводит к автоматическому преобразованию, иногда может быть разумнее просто выполнить явное преобразование.

double x = 1.1;
foo(static_cast<int>(x), boost::lexical_cast<int>(y));

Classi c Примером является использование std::move, которое преобразуется только в xvalue. .

...