如何避免为matrix与matrix_view编写大量模板操作符重载?
避免矩阵操作重载冗余的解决方案
不需要为matrix<T>和matrix_view<T>的组合编写全部四个重载,你可以通过通用模板+类型约束的方式,复用你最初定义的matrix_view版本的operator+,同时自动支持所有可转换为matrix_view的类型(包括matrix<T>)。
核心思路
模板类型推导确实不会考虑隐式转换,但我们可以让operator+接受任意可转换为matrix_view的类型,在函数内部统一转换为matrix_view后,调用你已实现的核心重载逻辑。
方案1:C++20 概念(Concept)实现(推荐)
先定义一个概念,限定哪些类型可以被视为“矩阵类”(即可转换为matrix_view):
#include <concepts> #include <utility> template<typename M> concept MatrixLike = requires(M&& m) { // 要求类型可以转换为对应的matrix_view { matrix_view(std::forward<M>(m)) } -> std::same_as<matrix_view<typename std::remove_cvref_t<M>::value_type>>; };
然后定义通用的operator+,自动转发到你最初的matrix_view版本:
// 你的核心实现(保留原代码) template <typename T, typename U> matrix<std::common_type_t<T, U>> operator+(matrix_view<T>, matrix_view<U>); // 通用重载,支持所有MatrixLike类型 template<MatrixLike M1, MatrixLike M2> auto operator+(M1&& a, M2&& b) { // 转换为matrix_view后调用核心实现 return operator+( matrix_view(std::forward<M1>(a)), matrix_view(std::forward<M2>(b)) ); }
这样不管是matrix<T>+matrix<T>、matrix<T>+matrix_view<T>还是其他组合,都会自动匹配这个通用重载,转换为matrix_view后执行核心逻辑。
方案2:C++17及以下(使用enable_if)
如果你的项目不支持C++20,可以用std::enable_if来做类型约束:
#include <type_traits> #include <utility> // 核心实现(保留原代码) template <typename T, typename U> matrix<std::common_type_t<T, U>> operator+(matrix_view<T>, matrix_view<U>); // 通用重载 template<typename M1, typename M2> std::enable_if_t< // 约束M1可转换为对应的matrix_view std::is_convertible_v<M1, matrix_view<typename M1::value_type>> && // 约束M2可转换为对应的matrix_view std::is_convertible_v<M2, matrix_view<typename M2::value_type>>, // 返回值类型 matrix<std::common_type_t<typename M1::value_type, typename M2::value_type>> > operator+(M1&& a, M2&& b) { return operator+( matrix_view(std::forward<M1>(a)), matrix_view(std::forward<M2>(b)) ); }
优势
- 无需编写多个重复重载,所有可转换为
matrix_view的类型(包括未来新增的类型)都能自动支持operator+ - 核心逻辑只需要维护一份,降低代码冗余和维护成本
内容的提问来源于stack exchange,提问作者Masquue
相关产品推荐
相关产品推荐

