のは、私はクラスがあるとしましょう:明確に定義されたoperator +=
で非友人シングルライン演算子+過負荷+ =
class A
{
//...
};
:
A& operator +=(const A&) {return *this;} //class without members
それでは、またoperator+
をオーバーロードしてみましょう(非友人として)。ここには良いです
A operator +(const A& other) const
{
return auto(*this)(*this) += other; //error: invalid use of auto
// /\/\/\/\/\ /\
// type of *this ||
// constructor call
}
auto
:私は一時オブジェクト(ちょっとこれは汎用コードを作りたい)のコンストラクタを呼び出すために、クラス名を使用する必要はありません。試してみましょうdecltype
(それは私が考えたものだ)
A operator +(const A& other) const
{
return decltype(*this)(*this) += other; //error: 'A& A::operator+=(const A&)' discards
// /\/\/\/\/\/\/\ /\ qualifiers [-fpermissive] return
// type of *this || decltype(*this)(*this) += other;
// constructor call ^
}
この
は*this
の外型を取得するために管理しますが、
operator+
はconstとして宣言されているので、私たちは推測
const A
を得ました。だから続けよう:
A operator +(const A& other) const
{
return typename std::remove_const<decltype(*this)>::type(*this) += amount;
//same error as previous
}
今私は気が狂った。でも、それはまだ 修飾子を破棄し、私はconst性を取り除くと思いました。まあ、多分私がやっていたのはちょうどキャスティングだったからかもしれません。とてもばかげている。私は(タイプ以外に)持っている::コンストラクタコードを生成しなければならないコンストラクタを呼び出すには(そう、私も、コンストラクタのエイリアスを作ってみましたが、この時点で、私は懸命に失敗しました)。私の壊れた脳はあきらめたが、私の意識の残りの部分は私に与えたソリューション(書面での一般的なので、それは良いことだ):私は終わったものだ
// outside of class
template<class A>
inline A&& make_rvalue(A copy)
{
return std::move(copy);
}
// inside of class
A operator +(const A& other) const
{
return make_rvalue(*this) += other; // such generic code
}
。しかし、他の関数呼び出しを伴わないトリックはありますか?
編集:私はこれを行うための古典的な方法を知っているが、私は検索すると、以下の通りである:
- オペレータが
{return /*...*/;}
- に低減され、クラスメソッドまたはグローバル関数
- の名前を含みません他のタイプの過負荷を考慮して取る - それは交換ARとターゲット演算子を呼び出し
Matrix
クラス(ただし、プロキシ演算子ではあまり役立ちませんconst int&
上、class A != class B
いるので、値で引数int
を引数を取ることができませんgumentsは - は、両方が
- return文が与えられた
[email protected]
ためexacly同じである必要があり、同じreturn文を持つべきであるべきところ)操作([email protected] != [email protected]
の(可能な)順番を考慮するのにかかる過負荷状態にしているすべてのクラスである)OKですoperator +=
const refではなく、最初に値で引数を取るのはなぜですか? – Useless
何を言っているのか分かりません。 –
この '演算子+'は**一般的ではありません。それはタイプAのオブジェクトでトラフィックします。 A型の使用を避けるべき理由はありません。なぜなら、それが何であるかを正確に知っているからです。そしてジェネリックコードでさえ、あなたが扱っているタイプを知っているでしょう。この周回はすべて無意味です。 –