我正在为模板化的matrix<T>
和matrix_view<T>
实现一些矩阵运算。
template <typename T, typename U>
matrix<common_type_t<T, U>> operator+(matrix_view<T>, matrix_view<U>);
并期望它也能适用于matrix
matrix<int> a, b;
auto c = a + b;
因为存在从matrix<T>
到matrix_view<T>
的转换构造函数。
但它没有起作用,因为“类型推导不考虑隐式转换”规则。
所以我又加了一个过载
template <typename T, typename U>
matrix<common_type_t<T, U>> operator+(matrix<T>, matrix<U>);
但是故事还没有结束,对于matrix<T>
和matrix_view<T>
之间的operator+
,我需要定义另外两个重载来使它们工作。
现在我想知道我是否必须为每个矩阵运算定义所有的四个重载,这是很多样板代码,而且如果我将来要添加一些其他的类型,所需的重载的数量确实会随着所涉及的类型的数量呈指数增长。
这个问题有什么解决方法吗?最好只需要定义第一个重载。
2条答案
按热度按时间xqk2d5yq1#
使用一个概念:
此解决方案适用于
matrix_view
和matrix
的所有组合。注意,如果你使用一个公共基类
matrix_base
,这个概念可以被简化,就像表达式模板代码中常见的那样,但是它也可以用于完全不相关的类。7fyelxc52#
这就是我决定的解决方案,通过传统的方法专门化一个helper模板类。
@davidhigh的立即调用的lambda表达式(IILE)解决方案或
std::convertible
语义可能不像我在这里想要的那样准确。