C++类参数这是什么

C++ Class parameter what is this?

本文关键字:是什么 参数 C++      更新时间:2023-10-16

当我学习"类模板部分专业化"时,我阅读了以下代码

#include <iostream>
using namespace std;
template <typename T1, typename T2>
class stream
{
  public:
   void f() {   cout << endl << "stream<typename T1, typename T2>::f()";  }
};
template <typename T1>
class stream<T1, int>
{
  public:
   void f() { cout << endl << "stream<typename T1, int>::f()"; }
};
int main()
{
   stream<char, float> si ;
   stream<double, int> sc ;
   si.f();
   sc.f();    
   cout << endl;
   return 0 ;
}

在上面的代码中,我无法理解行

class stream<T1, int>

这两个参数T1,int是该类构造函数的参数还是其他参数?如果我们用<…,…>指定某个列表在类声明期间,这是什么?如何理解这一点?

这是"class Template partial Specialization"中的"partial",您指定了一些但不是全部的模板参数。在main中,stream<double, int>匹配部分专用化,因为它的第二个参数是int

第一个模板采用2个泛型参数,当指定一个泛型参数和一个int时,将调用第二个。这意味着你提供了一个不同的实现,比如说当一组特定的类型被发送进来时的性能。

如果部分专门化模板,则必须传递参数。这正是这条线的作用。stream是一个包含两个参数的类模板。部分专用化将第二个参数固定为int,同时保留第一个一变量。因此,专业化少了一个自变量(只有T1)。您必须告诉编译器哪一个参数是固定的,所以您必须将类型参数传递给模板。这是在class stream<T1, int>行中完成的。

请参阅维基百科中的以下引文

如果知道一个类模板将经常与特定的数据类型一起使用,并且这种数据类型允许一些优化(例如,用整数移位,而不是乘2或除2),则可以通过指定另一个相同的类模板来专门化模板,但要指定参数类型。当编译器看到这样的类模板在代码中实例化时,它通常会选择与实例化匹配的最专业的模板定义。因此,如果所有模板参数匹配,则显式专门化(指定所有模板参数的专门化)将优先于部分专门化。

因此,它是为了帮助编译器优化模板。