是类型 []吗?例如,我可以
T<int[]>;
用于某些模板T。
答案 0 :(得分:5)
类型为T
的“数组的类型为T [dimension]
,您可以将其作为模板参数传递。 E.g:
someTemplate<int [10]> t; // array type as template parameter
int a[5]; // array of 5 ints named 'a'
数组的维度必须大于0.这意味着,例如U u[];
是非法的。
有些情况可能看似异常,第一个是参数:
void f(T[]);
这是参数的特殊规则,f()
实际上等同于以下内容:
void f(T*);
然后是数组的直接初始化:
int a[] = { 1, 2, 3, 4 };
此处,数组大小通过初始值设定项中的元素数隐式给出,因此a
的类型为int[4]
。
还有不完整的数组类型没有特定的边界,但是你不能直接创建这些的实例(更多请参阅Johannes的答案):
template<class T> struct X { typedef T type; };
X<int[]>::type a = { 1, 2, 3 };
如果您正在寻找动态数组,请选择标准容器,例如std::vector<T>
。
答案 1 :(得分:3)
有两种语法来表示数组类型。第一个是 type-id 语法,用于语言需要编译时类型的任何地方,如下所示:
T[constant-expression]
T[]
这指定了一种数组类型,在第一种形式中,它具有由整数常量表达式给出的多个元素(意味着它必须在编译时知道)。在第二种形式中,它指定具有未知数量元素的数组类型。类似于您在没有正文的情况下声明的类类型,这种数组类型被称为不完整,并且您无法创建该类型的数组
// not valid: what size would it have?
int a[];
但是,您可以指定该类型。例如,您可以键入dede it
typedef int unknown_int_array[];
以同样的方式,您可以将其指定为模板类型参数,因此您的问题的答案是是您可以将这样的说明符传递给模板。请注意,我在这里谈论说明符,因为您在此处使用的表单不是类型本身。
第二种方法是使用 new-type-id 语法,该语法允许通过非常量边界来表示运行时类型
T[expression]
这允许将变量作为元素计数传递,并且还允许传递零。在这种情况下,创建零元素阵列。该语法仅适用于new
运算符以支持动态数组。
答案 2 :(得分:2)
如果可能,您可以考虑使用动态数组,并将指针作为模板化类型传入。比如...
T<int*> myVar;
答案 3 :(得分:1)
这开始是对Georg的答案的评论,但它有点长......
似乎你可能在数组的心理模型中缺少一些关键的抽象(至少是C风格的)。使用硬编码大小在堆栈上分配本地数组。如果在类或结构中有数组,则数组的空间是对象本身的一部分(无论是在堆栈还是堆上)。全局数组甚至可以直接用可执行文件的大小表示。
这意味着只要您想使用数组,就必须为编译器指定其大小。您可以在参数列表中将括号留空的唯一原因是函数将数组参数视为指针。如果它只能在一个大小的数组上运行,那么该函数几乎没用。
模板也不例外。如果希望模板化数组的大小发生变化,可以添加额外的模板参数。但是,您仍然必须在编译时为任何给定实例指定大小。
答案 4 :(得分:0)
声明数组的语法是
<type> <variable>[<size>];
使用模板时,声明是例如
template <class T>
T var[4];