11

考虑一个简单的函数模板:

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

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

在第一次调用 ( FunctionTemplate(a)) 时,编译器计算出引发问题的类型,是否存在调用 FunctionTemplate ( FunctionTemplate<int>(a)) 的第二种方式的任何理由,或者我们不能使用第一种方法的任何令人信服的理由?

编辑:我的术语有点偏离,所以请根据需要进行编辑。

4

3 回答 3

13

有时您会想要指定模板参数,即使您不必这样做。假设您的函数接受一个类型的参数,T并且您有一个,int但您希望该函数将其作为一个float. 然后你需要明确地说FunctionTemplate<float>(my_int).

模板参数不能推导出来的情况也很多。考虑以下:

template <typename T>
T FunctionTemplate() {
  return T();
}

不管怎么称呼,如果不提供模板参数,T就无法自动推导出类型。在这种情况下,简单的原因是调用站点没有说明它期望返回类型是什么。

对于术语:当您不指定模板参数时,模板被隐式实例化;当您指定模板参数时,模板将被显式实例化。

于 2013-03-09T19:37:23.550 回答
9

假设你想将函数作为参数传递给另一个方法;

myAlgorithm( myFunction<int> );

或者假设您想保证函数的浮点版本用于速度;

myFunction<float>( 2.0 );

(现在忘记写2.0f不是问题)

于 2013-03-09T19:36:59.093 回答
7

一种用法是强制编译器使用特定版本的模板函数:

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
}
于 2013-03-09T19:43:01.013 回答