c ++中的class T(你的定义)

时间:2010-03-26 10:04:10

标签: c++ templates function-templates

在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,对于每种数据类型,我们必须添加其相应的数据类型条件,即另一组if语句用于int,另一组用于float。

我说错了吗?

4 个答案:

答案 0 :(得分:12)

它不一定是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);

实际上指向两个不同的函数,一个采用float,另一个采用整数。因此模板允许编译器为我们进行复制和粘贴(以更智能的方式)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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