第二个指定类型在模板typename声明中的含义是什么?

hal*_*y9k 4 c++ templates

我很熟悉模板函数和类,但是当我看到它时,我不知道该怎么做.我相信它可能是大多数日常语法,但我想得到一个明确的解释,如果有人为我.第二个uint32-t max意味着什么?它是如何在模板化类型中使用的?

继承人的语法:

template <typename T, uint32_t max>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Jam*_*nze 12

这是模板的第二个参数.模板参数不必是类型.它们也可以是常量或模板.因此,给定

template <typename T, uint32_t max> class TC {};
Run Code Online (Sandbox Code Playgroud)

你会实例化它:

TC< MyClass, 42 > t;
Run Code Online (Sandbox Code Playgroud)

(例如.)同样,如果它是一个函数模板:

template <typename T, uint32_t max> void tf( T (&array)[max] );
Run Code Online (Sandbox Code Playgroud)

类型推导可用于确定(数值)值max.

这样的值模板不能只有任何类型; 它必须是整数类型或指针或引用.


dun*_*123 10

第二个参数是一个uint32_t而不是一个类型.例如,它可以指定数组中的元素数.

template <typename T, uint32_t max>
struct Array
{
    T data[max];
};

/* ... */

// usage example 
Array<double, 10> a;
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 8

这样您就可以将非类型值指定为模板参数.

一个很好的例子是std::array,它有两个模板参数,包含数据的类型和数组的大小.

例如

std:array<int, 256> my_array;
Run Code Online (Sandbox Code Playgroud)

请注意,您不能将任何类型用作值模板参数,它基本上仅限于指针,引用和整数值.


nij*_*sen 5

您可以使用类型,整数值甚至模板作为模板参数.有很多理由说明为什么以及如何使用它,并且不可能告诉你它在你的具体情况下做了什么.

例如,考虑这个函数返回指向数组末尾的指针(类似于std::endC++ 11中的C数组):

template <typename T, size_t k>
T * end(T (& arr)[k])
{
    return arr + k;
}
Run Code Online (Sandbox Code Playgroud)