有明确说明模板类型的原因吗?

时间:2013-03-09 19:32:45

标签: c++ templates

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

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

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

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

修改:我的术语有点偏差,所以请根据需要进行修改。

3 个答案:

答案 0 :(得分:13)

有时你会想要来指定模板参数,即使你不需要。假设您的函数采用T类型的参数,并且您有int,但您希望函数将其视为float。然后你需要明确说出FunctionTemplate<float>(my_int)

还有很多情况下无法推断出模板参数。请考虑以下事项:

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

无论您如何调用此方法,如果您未提供模板参数,则无法自动推导出T的类型。在这种情况下,一个简单的原因是调用站点没有说明它希望返回类型是什么。

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

答案 1 :(得分:9)

假设您要将该函数作为参数传递给另一个方法;

myAlgorithm( myFunction<int> );

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

myFunction<float>( 2.0 );

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

答案 2 :(得分: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
}