Есть ли причина явно указывать тип шаблона?
Рассмотрим простой шаблон функции:
template <typename T>
void FunctionTemplate(T t){
}
void MyFunction(){
int a;
FunctionTemplate(a);
FunctionTemplate<int>(a);
}
В первом вызове (FunctionTemplate(a)
) компилятор выдает тип, вызывающий вопрос, есть ли причина существования второго способа вызова FunctionTemplate (FunctionTemplate<int>(a)
) или любых веских причин, по которым мы не мог использовать первый метод?
Изменить: Моя терминология моя немного, поэтому, пожалуйста, отредактируйте по мере необходимости.
Ответы
Ответ 1
Иногда вам нужно указать аргумент шаблона, даже если вам это не нужно. Скажем, ваша функция принимает аргумент типа T
, и у вас есть int
, но вы хотите, чтобы функция воспринимала его как float
. Тогда вам нужно явно указать FunctionTemplate<float>(my_int)
.
Существует также множество случаев, когда параметр шаблона не может быть выведен. Рассмотрим следующее:
template <typename T>
T FunctionTemplate() {
return T();
}
Независимо от того, как вы это называете, если аргумент шаблона не указан, тип T
не может быть автоматически выведен. Простая причина в этом случае заключается в том, что вызывающий сайт ничего не говорит о том, что ожидает тип возврата.
Для терминологии: когда вы не указываете аргументы шаблона, шаблон неявно создается; когда вы указываете аргументы шаблона, шаблон явно создается.
Ответ 2
Предположим, вы хотите передать функцию другому методу в качестве параметра;
myAlgorithm( myFunction<int> );
Или предположим, что вы хотите гарантировать, что функция с плавающей запятой используется для скорости;
myFunction<float>( 2.0 );
(забыть писать 2.0f
теперь не проблема)
Ответ 3
Использование вынуждает компилятор использовать определенную версию функции шаблона:
template <typename T>
T func(T x, T y)
{
// ...
}
int main()
{
int x = 10;
float y = 20;
func(x, y); //ERROR no matching function for call to 'func(int&, float&)'
func<float>(x, y); // OK, Uses float version of func
}