我有一个类,它存储一个标量以及相关的物理维度指数:
template <int L, int M, int T, int C, int K, int S, int I>
class Dimension<L, M, T, C, K, S, I>
{
...
}
我想构建一个像类(Vec)这样的向量,带有静态存储,它存储了这些对象的数组。 我认为Vec类模板看起来像:
template <Dimension<L, M, T, C, K, S, I> D, size_t N>
class Vec
{
...
}
但这会导致错误,因为模板参数D
取决于模板参数(L
,M
,T
,C
,{{1} },K
,S
)。我已经通过蛮力尝试了一些事情,但我只是在猜测,并希望有专业人士展示正确的方法。
我见过将I
插入到模板参数中的示例,但我不太清楚它实现了什么,或者它实际上是否适用。非常感谢你的帮助。
请注意,我知道这些类示例之前已经实现过,可能更好。
编辑:修正了拼写错误并更改了Vec类的名称。
答案 0 :(得分:1)
如果我理解正确,您需要template template
个参数。
无论如何,首先要记住使用struct
(或class
)这个词Dimension
template <int L, int M, int T, int C, int K, int S, int I>
struct Dimension
{ };
其次,您可以声明类型vect
(请,而不是vector
,可以与标准std::vector
发生冲突),如下所示
template <typename, std::size_t>
struct vect;
作为接收类型和无符号整数。
然后你可以实现部分特化(模板整数值的std::cout
exaple),如下所示
template <template <int, int, int, int, int, int, int> class Dim,
int L, int M, int T, int C, int K, int S, int I, std::size_t N>
struct vect<Dim<L, M, T, C, K, S, I>, N>
{
vect ()
{ std::cout << " - L: " << L << " - M: " << M << " - T: " << T
<< " - C: " << C << " - K: " << K << " - S: " << S
<< " - I: " << I << " - N: " << N << std::endl; }
};
您可以使用此vect
,如下所示
vect<Dimension<2, 3, 5, 7, 11, 13, 17>, 42> v;
这也适用于C ++ 98。
如果您可以使用C ++ 11或更高版本,则可以使用可变参数,以便vect
专业化可以简化(稍微),如下所示
template <template <int...> class Dim,
int L, int M, int T, int C, int K, int S, int I, std::size_t N>
struct vect<Dim<L, M, T, C, K, S, I>, N>
{ /* ... */ };
或者,使用可变参数,再多一点
template <template <int...> class Dim, int ... Is, std::size_t N>
struct vect<Dim<Is...>, N>
{ /* ... */ };
但是,在这种情况下,使用单个Is...
值会有点复杂。
但是,如果你至少可以使用C ++ 11,我强烈建议(遵循Miles Budnek的例子)使用std::array
。