-2

是否可以重载运算符 +

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;
4

3 回答 3

1

除非矩阵的维度被制成 的模板参数Mat,并且您部分地专门化了矩阵的Mat模板。1x1

或者,您可以返回Matrix(1,1)然后转换为标量。如果您这样做,您将不得不接受转换在运行时失败的可能性。

于 2012-11-27T21:54:54.313 回答
1

可以超载operator +做任何你喜欢的事情。主要问题是,您如何定义矩阵和标量的相加?即使您向 1x1 矩阵添加标量,传统数学仍然无法定义操作,因为 1x1 矩阵仍然是向量,而不是标量。

于 2012-11-27T21:59:20.617 回答
1

如果我想这样做(并且像这样的自动转换可能既危险又烦人),我会专门Matrix<1,1,T>使用一个operator T()(或使用enable_if类型 mojo,这样我就不必做样板)。

然后标量加法将通过将Matrixa转换T为 a来工作T,而不是显式覆盖 in Matrix。此外,您的 1x1Matrix可以直接T隐式转换为您似乎也想要的。

顺便说一句,另一个真正自然的对应关系是从标量到标量乘以任何大小的单位矩阵,反之亦然。1x1 矩阵情况是这种情况的一个特例,因为所有 1x1 矩阵都是单位矩阵乘以标量。

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

于 2012-11-27T22:37:26.940 回答