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

How to use a template class as a template parameter?

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

template <int L, int M, int T, int C, int K, int S, int I>
class Dimension<L, M, T, C, K, S, I>
{
    ...
}

我想构建一个类似于 class (Vec) 的向量,它具有静态存储,用于存储这些对象的数组。 我假设 Vec class 模板看起来像:

template <Dimension<L, M, T, C, K, S, I> D, size_t N>
class Vec
{
    ...
}

但这会导致错误,因为模板参数 D 取决于模板参数 (LMTCKSI)。我已经通过蛮力尝试了几件事,但我只是在猜测,并且更愿意由在这方面具有专业知识的人向他们展示正确的方法。

我看到过在模板参数中插入 template<class> 的例子,但我不太明白它实现了什么,甚至它是否实际适用。非常感谢您的帮助。

请注意,我知道这些 class 示例以前已经实现过,可能是以更好的方式实现的。

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

如果我没理解错的话,你需要 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 模板整数值的例子)如下

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