Mor*_*enn 6 c++ templates template-specialization c++11
我最近想出了一个问题.我实际上认为它不能像我希望的那样得到解决,但如果可能的话它会非常方便.无论如何,这是问题所在:
我将在几天前在这个论坛上看到一个例子,因为它更容易用它来解释.假设我正在尝试以这种方式创建Tensor结构:
template <int N>
struct Tensor
{
Tensor<N - 1> x;
Tensor<N - 1> y;
Tensor<N - 1> z;
};
Run Code Online (Sandbox Code Playgroud)
为了避免无限递归,我必须为N = 1编写模板特化.
template<>
struct Tensor<1>
{
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud)
实际上,当N = 1时,这个Tensor实际上是一个Vector(物理的).假设我已经以这种方式定义了Vector结构:
struct Vector
{
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud)
这个结构与Tensor <1>完全相同.由于Vector结构已经存在,并且假设我自己没有实现它,我希望能够使Tensor <1>结构成为Vector结构的别名.就像typedef一样.所以,我想这样做:
// C++03
typedef Vector Tensor<1>;
// or C++11
using Tensor<1> = Vector;
Run Code Online (Sandbox Code Playgroud)
这样,Tensor <1>和Vector将是完全相同的结构,所以我可以在程序中的任何地方使用一个而不是另一个,我不需要两次编写相同的结构.
但是,实际上不可能以这种方式定义模板专业化.如果是的话,我不会在那里问这个问题.
注意:我知道前面的例子不是很好,因为我们仍然可以这样做:
using Vector = Tensor<1>;
Run Code Online (Sandbox Code Playgroud)
但如果我想用两种不同结构的特化来做这件事,那就太麻烦了.例如,在编写可以在N维空间中计算几何的几何库时:
using Circle<2> = Hypersphere<2>;
Run Code Online (Sandbox Code Playgroud)
总而言之:有没有办法通过将模板特化定义为另一个的别名来创建模板特化?
鉴于遗留类Scalar,Vector和Matrix,您可以使用继承:
template<>
class Tensor<0>: public Scalar {};
template<>
class Tensor<1>: public Vector {};
template<>
class Tensor<2>: public Matrix {};
Run Code Online (Sandbox Code Playgroud)
请注意,这不是滥用继承,因为您正在建模is-a关系.
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |