为什么模板typedef是C++(而不是C++ 11)中的一个问题

Sam*_*rsa 5 c++ templates typedef

这个问题中,OP要求解决模板typedef,这在C++中是不可能的.OP也提出了一个解决方案,但不喜欢它:

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

// Problem - will not compile
typedef Matrix<N,1> Vector<N>;

// Solution
template <int N>
class Vector: public Matrix<N,1>
{ };
Run Code Online (Sandbox Code Playgroud)

我的问题是,该Helper::type 解决方案在OP的解决方案上给我们带来了什么优势(假设这些类永远不会被基指针使用或者new像这样)?一个空类在释放时应该没有开销(或者是吗?).我能看到的唯一缺点是,在调试版本中,您必须在调试时扩展基类.

编辑:除了选定的答案,请参阅@ Dani的回答谁建议继承版本需要定义构造函数,这是一个额外的不便.

Dan*_*ani 7

这是因为构造函数不是继承的(并且在c ++ 11中不是默认的).所以你必须复制所有非默认构造,即使你只是在实现中调用基类构造函数.


Tad*_*pec 7

重点typedef是定义类型别名.子类不是类型别名 - 它是一种新类型.

例如,想象一下库函数

template<size_t N, size_t M>
Matrix<N, M> * createMatrix();
Run Code Online (Sandbox Code Playgroud)

现在有助手类型

Vector<3>::type * var = createMatrix<3, 1>();
Run Code Online (Sandbox Code Playgroud)

是合法的.
继承

Vector<3> * var = createMatrix<3, 1>();
Run Code Online (Sandbox Code Playgroud)

不是.