1 在设计矩阵与矩阵相乘时后有三种情形:矩阵×矩阵,向量×矩阵,矩阵×向量。如果采用模板设计矩阵乘法并不能通过模板参数特化区分出三种情形,因为模板参数本身没有任何约束,导致无法区分重载。可以采用标签的方式分辨重载,标签是一个空类,其目的是为声明一种独特的类型用于分辨重载,不同的标签之间可以继承。在模板实例化时首先提取标签类型,根据标签类型调用具体的模板。实例如下:
// 矩阵与向量标签
struct matrix_tag {};
struct vector_tag {};
// 提取矩阵及向量类型标准的特性类
template<typename MV>
struct matrix_vector_traits {
typedef typename MV::tag tag;
};
// 元函数return_type_of//
// 求得矩阵×矩阵、矩阵×向量、向量×矩阵三种情况下的算式结果类型
// 通例:默认情况,返回左算子类型
template<typename MV1, typename MV2,
typename tag1, typename tag2>
struct return_type_of {
typedef MV1 type;
};
// 特例:只有矩阵×向量时,返回右算子即向量的类型
template<typename MV1, typename MV2>
struct return_type_of<MV1, MV2, matrix_tag, vector_tag> {
typedef MV2 type;
};
// 元函数return_type_of结束//
// 矩阵与向量乘法的入口函数
template<typename MV1, typename MV2>
typename return_type_of<MV1, MV2,
typename matrix_vector_traits<MV1>::tag,
typename matrix_vector_traits<MV2>::tag>::type
prod(MV1 const &mv1, MV2 const &mv2) {
return prod(mv1, mv2,
typename matrix_vector_traits<MV1>::tag(),
typename matrix_vector_traits<MV2>::tag());
}
// 两矩阵相乘
template<typename Matrix1, typename Matrix2>
Matrix1 prod(Matrix1 const &m1, Matrix2 const &m2, matrix_tag, matrix_tag);
// 矩阵×向量
template<typename Matrix, typename Vector>
Vector prod(Matrix const &m, Vector const &v, matrix_tag, vector_tag);
// 向量×矩阵
template<typename Vector, typename Matrix>
Vector prod(Vector const &v, Mat