我之前看到过这样的代码:
using A = std::vector<std::vector<T>...>
其中T
是一个可变模板参数列表。我想知道在最后一个尖括号和第一个尖括号放置参数包之间的区别。例如:
using B = std::vector<std::vector<T...>>;
这两个都可以编译通过,但我不知道它们之间有什么区别。
能有人解释一下吗?谢谢。
...
之前的模式(pattern)将针对pack中的每个元素进行重复,因此vector<T>...
表示扩展为vector<T1>, vector<T2>, vector<T3>
而vector<T...>
则表示扩展为vector<T1, T2, T3>
。std::vector<std::vector<T1>, std::vector<T2>>
并且
std::vector<std::vector<T1, T2>>
两者不同。第一个不能编译,第二个模板参数必须是分配器类型,而不是向量类型std::vector
。如果T2
是分配器类型,则第二个将编译通过。
在实例化 A<T1, T2, T3>
时,它被展开为:
std::vector<std::vector<T1>, std::vector<T2>, std::vector<T3>>
B
,您会得到以下结果:std::vector<std::vector<T1, T2, T3>>