-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を部分的に特殊化しない限り、そうではありません。Mat1x1

Matrix(1,1)または、戻ってからスカラーに変換することもできます。これを行った場合、実行時に変換が失敗する可能性を受け入れる必要があります。

于 2012-11-27T21:54:54.313 に答える
1

もし私がこれをしたいのなら (そして、このような自動変換は危険で迷惑なものになる可能性があります)、私は代わりMatrix<1,1,T>に anを専門化しますoperator T()(またはenable_if型 mojo を使用して、ボイラープレートを実行する必要がないようにします)。

次に、 をで明示的にオーバーライドするのではなくMatrixTを として に変換することで、スカラー加算が機能します。さらに、あなたの 1x1は暗黙的に直接変換されますが、これもあなたが望んでいるようです。TMatrixMatrixT

余談ですが、もう 1 つの本当に自然な対応は、スカラーからスカラー倍の任意のサイズの恒等行列への対応、およびその逆です。1x1 マトリックスのケースは、これの特殊なケースです。すべての 1x1 マトリックスは単位マトリックスにスカラーを掛けたものだからです。

そのため、(単位行列にスカラーを掛けたスカラーへの) 変換は、ある程度意味があり、オーバーライドが必要になる場合があります。逆の変換は、コンパイル時にチェックを行うのは不合理であり、失敗する可能性があるため、より危険です。

于 2012-11-27T22:37:26.940 に答える
1

オーバーロードして好きなことをすることができoperator +ます。主な質問は、行列とスカラーの加算をどのように定義しているのかということです。1x1 行列にスカラーを追加している場合でも、1x1 行列はスカラーではなくベクトルであるため、演算は従来の数学では定義されていません。

于 2012-11-27T21:59:20.617 に答える