是否可以重载operator +
template <typename U>
Mat <T> operator + ( const Mat <U> &A );
用于以下矩阵运算
Matrix (1,1) + scalar = scalar
scalar + Matrix (1,1) = scalar
Matrix(1,1) + Matrix(1,1) = scalar
和语法(或类似的)?
template <typename T, typename U>
T operator + ( const Mat <U> &M ) const;
更新了问题:
维度作为模板参数:
template <typename T, typename U, const unsigned int TDim>
T operator + ( const Mat <U> &M, TDim <dim> ) const;
专门针对dim = 1
template <typename T, typename U>
T operator + ( const Mat <U> &M, TDim <1> ) const;
答案 0 :(得分:1)
除非将矩阵的维度设为Mat
的模板参数,否则您部分专门设定Mat
矩阵的1x1
模板。
或者,您可以返回Matrix(1,1)
,然后转换为标量。如果你这样做,你必须接受转换在运行时失败的可能性。
答案 1 :(得分:1)
你可以重载operator +
来做任何你喜欢的事情。主要问题是,如何定义矩阵和标量的加法?即使您在1x1矩阵中添加标量,传统数学仍然不会定义该操作,因为1x1矩阵仍然是矢量,而不是标量。
答案 2 :(得分:1)
如果我想这样做(并且这样的自动转换既危险又烦人),我会专门Matrix<1,1,T>
使用operator T()
(或使用enable_if
类型mojo,我不需要做样板。)
然后标量添加可以将Matrix
转换为T
作为T
,而不是Matrix
中的显式覆盖。此外,您的1x1 Matrix
可以隐式转换为T
,这也是您似乎想要的。
另外,另一个非常自然的对应关系是从Scalars到Scalar时代的任意大小的身份矩阵,反之亦然。 1x1矩阵情况就是这种情况的特例,因为所有1x1矩阵都是标识矩阵乘以标量。
因此转换(到标识矩阵乘以标量的标量)可能有一定意义,并且需要一些覆盖。相反的转换更危险,因为在编译时进行检查是不合理的,因此它可能会失败。