2

这发生在模板专业化或条件表达式之后的思路中?.

我在我的一个项目中使用模板专业化,并从 Stroustrup 遇到了这个例子:Matrix.h,他在其中声明了一个 MatrixBase 模板类

template<class T> class Matrix_base

用于公共元素和 Matrix 模板类

template<class T = double, int D = 1> class Matrix

作为专业的“道具”(无论是什么)。他将构造函数声明为私有的,因此只能实例化特化。声明如下:

template<class T> class Matrix<T,1> : public Matrix_base<T> {...};
template<class T> class Matrix<T,2> : public Matrix_base<T> {...};
template<class T> class Matrix<T,3> : public Matrix_base<T> {...};

我的问题是:在这种情况下,专业化的优势是什么?显然这三个专业没有共同的代码,所以为什么不剪掉通用模板并声明:

template<class T> class Matrix_1<T> : public Matrix_base<T> {...};
template<class T> class Matrix_2<T> : public Matrix_base<T> {...};
template<class T> class Matrix_3<T> : public Matrix_base<T> {...};

?

4

2 回答 2

5

因为通过具有第二个模板参数,一个允许专业化以及通用的、非专业化的实现。所以

Matrix<float, 1000> m;

可能会做一些合理但非专业的事情,而您必须定义一个Matrix_1000<T>. 编辑:第一点一般适用,但不适用于这种特殊情况,一般情况下有一个私有构造函数。

此外,它还允许您执行以下操作

Matrix<double, SOME_CONSTANT> m;

你不能用你的_N解决方案来做。

于 2012-07-04T12:13:06.837 回答
2

基本上答案是您可以在通用代码中使用模板。您可以使用编译时常量来更改程序的行为,或者您可以编写通用代码Matrix来处理如果类型具有不同名称则无法处理的不同版本的类:

template <typename T, int D>
void print( std::ostream& o, Matrix<T,D> const & m ) { ...

也就是说,即使您需要显式创建不同的类型,专业化机制也允许您提供一个名称,该名称可以通用地用于管理不同的类型,就好像它们只是一种单一类型的变体一样。

于 2012-07-04T13:28:02.030 回答