我现在正在阅读本书,C++模板:完整指南.在一段时间我被卡住无法理解术语,这里是段落:
一个基本原则是任何模板参数必须是可以在编译时确定的数量或值.如后所述,此要求转化为模板实体的运行时成本的显着优势.因为模板参数最终被编译时值替换,所以它们本身可以用于形成编译时表达式.这在ArrayInClass模板中被利用来调整成员数组数组的大小.数组的大小必须是所谓的常量表达式,模板参数N必须符合这一要求.
我们可以进一步推动这种推理:因为模板参数是编译时实体,所以它们也可以用于创建有效的模板参数.这是一个例子:
template <typename T>
class Dozen {
public:
ArrayInClass<T,12> contents;
};
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,名称T既是模板参数又是模板参数.因此,有一种机制可以从更简单的模板构建更复杂的模板.当然,这与允许我们组装类型和功能的机制没有根本的区别.
我无法理解任何事情.我很欣赏任何有关简单和理解单词的帮助.
编辑:
Arrayinclass:
template <typename T, int N>
class ArrayInClass {
public:
T array[N];
};
Run Code Online (Sandbox Code Playgroud)
在编译时需要知道C++中的某些表达式.例如:
int someArray[30];
Run Code Online (Sandbox Code Playgroud)
的30 必须是编译时在C++中是恒定的.它可能是:
int someArray[30 + 3];
Run Code Online (Sandbox Code Playgroud)
这很好,因为编译器具有在编译时计算生成数组有多大所需的所有信息.然而:
void MyFunc(int numItems) {
int someArray[30 + numItems];
}
Run Code Online (Sandbox Code Playgroud)
这不是编译时常量,因为用户可以MyFunc使用任何整数值进行调用.编译器不知道数组有多大,所以这是一个编译器错误.
(注意:C99允许创建像这样的任意大小的数组.C++没有).
由于模板参数是编译时值,因此可以将其传递给需要编译时值的其他位置:
template<int ArrayLen> void MyFunc() {
int someArray[30 + ArrayLen];
}
Run Code Online (Sandbox Code Playgroud)
这是合法的 C++,因为每次使用都MyFunc必须指定一个编译时整数:数组的长度.你不能只打电话给MyFunc()你打电话MyFunc<21>().并且由于模板参数必须是编译时可确定的值,因此用户自己无法提供不是编译时定义的值.
由于模板参数始终是编译时定义的,因此您可以嵌套模板:
template<int ArrayLen> void OtherFunc {
MyFunc<ArrayLen + 3>();
}
Run Code Online (Sandbox Code Playgroud)
这个新模板函数调用旧模板函数,其数组3比给定的数组大.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |