5

这个问题中,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>
{ };

我的问题是,与 OP 的解决方案相比,该Helper::type 解决方案给我们带来了哪些优势(假设这些类永远不会被基指针或new'd 这样使用)?一个空的类在发布时不应该带来任何开销(或者是吗?)。我能看到的唯一缺点是,在调试版本中,您必须在调试时扩展基类。

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

4

3 回答 3

7

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

于 2012-05-16T15:56:04.270 回答
7

的重点typedef是定义一个类型别名。子类不是类型别名——它是一种新类型。

例如,想象一些库函数

template<size_t N, size_t M>
Matrix<N, M> * createMatrix();

现在使用辅助类型

Vector<3>::type * var = createMatrix<3, 1>();

是合法的。
有继承

Vector<3> * var = createMatrix<3, 1>();

不是。

于 2012-05-16T15:58:38.660 回答
3

除了每个人都喜欢语法(可能是主观的)之外,主要区别在于,通过继承,vector 实际上是另一种衰减为矩阵的类型,而使用包含 typedef 的帮助器时,vector 是矩阵的别名(至少对于什么部分专业化适用)。

差异需要向量重新定义构造函数(不是继承的),或者在模板专业化定义的操作的情况下存在一些潜在的陷阱(使用 typedef,它们永远不会被视为“不同的”)

于 2012-05-16T16:04:01.370 回答