我最近遇到了一个问题。我实际上认为它无法像我希望的那样解决,但如果可以的话,它会非常方便。无论如何,这是问题所在:
我会给你一个我几天前在这个论坛上看到的例子,因为它会更容易解释。假设我正在尝试以这种方式创建张量结构:
template <int N>
struct Tensor
{
Tensor<N - 1> x;
Tensor<N - 1> y;
Tensor<N - 1> z;
};
为了避免无限递归,我必须为 N = 1 编写模板特化。
template<>
struct Tensor<1>
{
double x;
double y;
double z;
};
实际上,当 N = 1 时,这个 Tensor 实际上是一个 Vector(物理的)。假设我已经以这种方式定义了一个 Vector 结构:
struct Vector
{
double x;
double y;
double z;
};
这个结构和 Tensor<1> 完全一样。由于 Vector 结构已经存在,假设我自己没有实现它,我希望能够使 Tensor<1> 结构成为 Vector 结构的别名。就像 typedef 一样。所以,我想这样做:
// C++03
typedef Vector Tensor<1>;
// or C++11
using Tensor<1> = Vector;
这样一来,Tensor<1> 和 Vector 将是完全相同的结构,因此我可以在程序中任何我想要的地方使用一个而不是另一个,而我不必两次编写相同的结构。
但是,实际上不可能以这种方式定义模板特化。如果是这样,我就不会在那里问这个问题。
注意:我知道前面的例子不是一个好例子,因为我们仍然可以这样做:
using Vector = Tensor<1>;
但是,如果我想用两个不同结构的特化来做这件事,那就很麻烦了。例如,在编写可以在 N 维空间中计算几何的几何库时:
using Circle<2> = Hypersphere<2>;
所以,总结一下:有没有办法通过将模板特化定义为另一个模板的别名来创建它?