C++模板实战9:标签和策略类

这篇博客探讨了在C++中如何利用模板设计矩阵乘法,面对矩阵×矩阵、向量×矩阵、矩阵×向量等不同情况时,通过标签和策略类来区分重载。标签是一种空类,用于创建独特的类型以便于选择正确的模板实例。同时,介绍了虚基类模板的概念,它可以保存子类的类型信息,允许通过基类指针或引用进行多态操作,从而实现类模板的重载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值