C++模板中的一些混淆

Mr.*_*bis 4 c++ templates

我现在正在阅读本书,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)

Nic*_*las 7

在编译时需要知道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比给定的数组大.