3

在 c++ 中使用类 T 的一个优点是减少在函数中重新定义数据类型的时间,如果这些数据类型是在其他函数中定义的,例如 int main。

template <class T>
void showabs(T number)
{
  if (number < 0 )
    number  = -number;
  cout << number << endl;
  return 0;
}

int main()
{
  int num1 = -4;
  float num2 = -4.23f;

  showabs(num1);
  showabs(num2);

  return 0;
}

所以在这种情况下,在没有类T的情况下,对于每一种数据类型,我们都必须添加其对应的数据类型条件,即为int添加另一组if语句,为float添加另一组if语句。

我对么?

4

4 回答 4

14

它不必是class T。它可以是class Key或任何你想要的(你也可以用来typename代替class)。正确的术语是功能模板。使用函数模板消除了为可能传递给它的每种类型重新定义函数的要求。因此,如果您不使用模板,则必须定义两个函数:

void showabs(float number){
  if (number < 0 ) number  = -number;
  cout << number << endl;
}

void showabs(int number){
  if (number < 0 ) number  = -number;
  cout << number << endl;
}

这意味着很多重复的代码。在某些情况下,您可以使用void*指针(您在 C 中经常看到这种情况),但这样做会导致接口丑陋并且没有类型安全性。

值得注意的是,实际上,您的两个函数调用

showabs(num1); //showabs<int>(num1);
showabs(num2); //showabs<float>(num2);

实际上指向两个不同的函数,一个接受浮点数,一个接受整数。所以模板允许编译器为我们进行复制和粘贴(以更智能的方式)。

于 2010-03-26T10:09:26.390 回答
1

if语句无助于声明number参数的类型。我认为您的意思是您必须为showabs要处理的每种类型重载该函数。如果是这样,那么是的,你在正确的轨道上。

于 2010-03-26T10:07:20.160 回答
1

好吧,这不是“一个优势”,还有很多其他优势。模板是为重用而设计的,因此您可以将模板化的函数或类用于编写它们时不知道的类型。

于 2010-03-26T10:12:02.923 回答
1

基本上,你是对的,但是你可以用模板做更多的事情,即template-metaprogramming。为了澄清你的术语,class T也可以是typename Foo. class T是模板参数,带有模板参数的函数定义是函数模板,带有模板参数的类定义是类模板。

于 2010-03-26T10:12:16.870 回答