4

我对模板函数和类很满意,但是当我看到它时我不知道该怎么做。我相信它可能是大多数人的日常语法,但如果有人给我一个解释,我想得到一个很好的解释。第二个 uint32-t max 是什么意思,它在模板类型中是如何使用的?

继承人的语法:

template <typename T, uint32_t max>

提前致谢。

4

5 回答 5

12

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

template <typename T, uint32_t max> class TC {};

你会实例化它:

TC< MyClass, 42 > t;

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

template <typename T, uint32_t max> void tf( T (&array)[max] );

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

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

于 2013-08-12T08:20:14.727 回答
10

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

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

/* ... */

// usage example 
Array<double, 10> a;
于 2013-08-12T08:21:07.840 回答
8

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

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

例如

std:array<int, 256> my_array;

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

于 2013-08-12T08:21:33.523 回答
5

您可以使用类型、整数值甚至模板作为模板参数。有很多原因可以使用它以及如何使用它,并且不可能告诉您它在您的特定情况下的作用。

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

template <typename T, size_t k>
T * end(T (& arr)[k])
{
    return arr + k;
}
于 2013-08-12T08:22:59.103 回答
3

第二个uint32_t max意思是,在实例化模板时,您必须传递第二个模板参数,该参数类型uint32_t在编译时是已知的。

于 2013-08-12T08:21:33.920 回答