gpt4 book ai didi

c++ - C++模板中的一些困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:10 25 4
gpt4 key购买 nike

我正在读这本书,C++ 模板:完整指南。在一个段落我被卡住了无法理解术语,这是段落:

A fundamental principle is that any template argument must be a quantity or value that can be determined at compile time. As becomes clear later, this requirement translates into dramatic benefits for the run-time costs of template entities. Because template parameters are eventually substituted by compile-time values, they can themselves be used to form compile-time expressions. This was exploited in the ArrayInClass template to size the member array array. The size of an array must be a so-called constant-expression, and the template parameter N qualifies as such.

We can push this reasoning a little further: Because template parameters are compile-time entities, they can also be used to create valid template arguments. Here is an example :

template <typename T> 
class Dozen {
public:
ArrayInClass<T,12> contents;
};

Note how in this example the name T is both a template parameter and a template argument. Thus, a mechanism is available to enable the construction of more complex templates from simpler ones. Of course, this is not fundamentally different from the mechanisms that allow us to assemble types and functions.

我什么都听不懂。我非常感谢您对简单易懂的单词的帮助。

编辑:

数组类:

template <typename T, int N> 
class ArrayInClass {
public:
T array[N];
};

最佳答案

C++ 中有一些表达式需要在编译时知道。例如:

int someArray[30];

30 必须 是 C++ 中的编译时常量。它可能是:

int someArray[30 + 3];

这很好,因为编译器拥有在编译时计算数组大小所需的所有信息。然而:

void MyFunc(int numItems) {
int someArray[30 + numItems];
}

不是编译时常量,因为用户可以调用 MyFunc与任何整数值。编译器不知道该数组有多大,所以这是一个编译器错误。

(注意:C99 允许像这样创建任意大小的数组。C++ 不允许)。

因为模板参数是一个编译时值,所以可以将它传递到其他需要编译时值的地方:

template<int ArrayLen> void MyFunc() {
int someArray[30 + ArrayLen];
}

这是合法的 C++,因为每次使用 MyFunc必须指定一个编译时整数:数组的长度。你不能只打电话 MyFunc()你必须调用MyFunc<21>() .并且由于模板参数必须是编译时可确定的值,用户自己不能提供编译时未定义的值。

因为模板参数总是编译时定义,你可以嵌套模板:

template<int ArrayLen> void OtherFunc {
MyFunc<ArrayLen + 3>();
}

这个新的模板函数使用比给定的数组大 3 的数组调用旧模板函数。

关于c++ - C++模板中的一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7197227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com