如何使用模板类作为模板参数?

时间:2017-10-31 17:22:35

标签: c++ templates parameters template-templates

我有一个类,它存储一个标量以及相关的物理维度指数:

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取决于模板参数(LMTC,{{1} },KS)。我已经通过蛮力尝试了一些事情,但我只是在猜测,并希望有专业人士展示正确的方法。

我见过将I插入到模板参数中的示例,但我不太清楚它实现了什么,或者它实际上是否适用。非常感谢你的帮助。

请注意,我知道这些类示例之前已经实现过,可能更好。

编辑:修正了拼写错误并更改了Vec类的名称。

1 个答案:

答案 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