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

时间:2013-08-12 08:18:18

标签: c++ templates

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

下面是语法:

template <typename T, uint32_t max>

提前致谢。

5 个答案:

答案 0 :(得分: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的(数字)值。

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

答案 1 :(得分:10)

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

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

/* ... */

// usage example 
Array<double, 10> a;

答案 2 :(得分:8)

这样你可以指定一个非类型值作为模板参数。

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

例如

std:array<int, 256> my_array;

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

答案 3 :(得分:5)

您可以使用类型,整数值甚至模板作为模板参数。有很多原因可以解释为什么以及如何使用它,并且无法告诉你它在特定情况下的作用。

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

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

答案 4 :(得分:3)

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