为什么要使用专门的模板类?

时间:2012-07-04 12:07:32

标签: c++ templates template-specialization

这发生在Template specialization or conditional expressions?之后的思路中。

我在我的一个项目中使用模板特化,并从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> {...};

2 个答案:

答案 0 :(得分:5)

因为通过拥有第二个模板参数,可以实现的专业化以及一般的非专业化实现。所以

<击>
Matrix<float, 1000> m;

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

此外,它允许你做像

这样的事情
Matrix<double, SOME_CONSTANT> m;

您无法使用_N解决方案。

答案 1 :(得分:2)

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

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

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