C ++,为Matrix重载operator +

时间:2012-11-27 21:53:20

标签: c++ matrix operators operator-overloading

是否可以重载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;

3 个答案:

答案 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矩阵都是标识矩阵乘以标量。

因此转换(到标识矩阵乘以标量的标量)可能有一定意义,并且需要一些覆盖。相反的转换更危险,因为在编译时进行检查是不合理的,因此它可能会失败。