【问题标题】:class T in c++ (your definition)C ++中的T类(您的定义)
【发布时间】:2010-03-26 10:04:09
【问题描述】:

在 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语句。

我说的对吗?

【问题讨论】:

  • 当你说“使用T类”时,你真的是指“使用函数模板”吗?

标签: c++ templates function-templates


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对,对于每种类型,我必须在函数 showabs 中执行另一组 if 语句,类似于我们上面的那个。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 2011-09-24
        • 1970-01-01
        • 2011-09-20
        • 2014-04-23
        相关资源
        最近更新 更多