Подтвердить что ты не робот

Есть ли причина явно указывать тип шаблона?

Рассмотрим простой шаблон функции:

template <typename T>
void FunctionTemplate(T t){
}

void MyFunction(){
    int a;
    FunctionTemplate(a);
    FunctionTemplate<int>(a);
}

В первом вызове (FunctionTemplate(a)) компилятор выдает тип, вызывающий вопрос, есть ли причина существования второго способа вызова FunctionTemplate (FunctionTemplate<int>(a)) или любых веских причин, по которым мы не мог использовать первый метод?

Изменить: Моя терминология моя немного, поэтому, пожалуйста, отредактируйте по мере необходимости.

4b9b3361

Ответ 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
}