C++模板typedef

447

我有一个类

template<size_t N, size_t M>
class Matrix {
    // ....
};

我想创建一个typedef,它能够创建一个尺寸为N行1列的矩阵Vector(列向量),与Matrix等效。

typedef Matrix<N,1> Vector<N>;

这段代码会产生编译错误。下面的代码可以创建类似的东西,但并不完全符合我的需求:

template <size_t N>
class Vector: public Matrix<N,1>
{ };

有没有解决方案或不太昂贵的权宜之计/最佳实践?

1个回答

666

C++11新增了别名声明,它是typedef的一种推广,允许使用模板:

template <size_t N>
using Vector = Matrix<N, 1>;

类型Vector<3>等同于Matrix<3, 1>


C++03中,最接近的近似是:

template <size_t N>
struct Vector
{
    typedef Matrix<N, 1> type;
};

在这里,类型Vector<3>::type等同于Matrix<3, 1>


57
太好了,我之前没有看到C++0x的这部分内容,一直在抱怨模板化typedef...看来我应该更仔细地阅读最终稿。 - Matthieu M.
3
继承构造函数会使得原始解决方案更具可行性吗? - StackedCrooked
3
取决于他的目标。当使用组合时,我避免继承(当然,继承构造函数会使这两者都更容易),但当使用typedef时,我也会避免使用组合。 - GManNickG
3
如果我没记错的话,使用不支持特化,因此第二个选项在许多情况下仍然很有用。 - Utkarsh Bhardwaj
@UtkarshBhardwaj 注意,你可以将这两个结合起来使用,类似于<type_traits>中包含别名声明,例如std::remove_reference_t,它们引用了各种std::remove_reference的特化。 - Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接