C++类参数这是什么
C++ Class parameter what is this?
当我学习"类模板部分专业化"时,我阅读了以下代码
#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),则可以通过指定另一个相同的类模板来专门化模板,但要指定参数类型。当编译器看到这样的类模板在代码中实例化时,它通常会选择与实例化匹配的最专业的模板定义。因此,如果所有模板参数匹配,则显式专门化(指定所有模板参数的专门化)将优先于部分专门化。
因此,它是为了帮助编译器优化模板。
相关文章:
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 使用作为参数返回的指针的最佳做法是什么
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 通过引用函数传递指针参数是什么意思?
- 自动参数捕获的扣除规则是什么?
- FFT函数的参数是什么意思
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- "in"和"out"在参数方向上是什么意思?
- v8 源代码中 ArrayMap 函数的回调 fn 参数是什么?
- 使用对函数和IO对象的引用(作为参数)的目的是什么
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 遍历模板参数包,没有争论的专业化的作用是什么?
- 函数参数中的 v=0 是什么意思
- 这个奇怪的函数参数是什么?
- 这个函数的参数是什么?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?