如何使用模板 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
取决于模板参数 (L
、M
、T
、C
、K
、S
、I
)。我已经通过蛮力尝试了几件事,但我只是在猜测,并且更愿意由在这方面具有专业知识的人向他们展示正确的方法。
我看到过在模板参数中插入 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
。
我有一个 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
取决于模板参数 (L
、M
、T
、C
、K
、S
、I
)。我已经通过蛮力尝试了几件事,但我只是在猜测,并且更愿意由在这方面具有专业知识的人向他们展示正确的方法。
我看到过在模板参数中插入 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
。