クラスの移動セマンティクスの実装にかなりの時間を費やしてきましたが、今はそれを使用する関数を扱っています。
さて、ヒープ上に大量のデータを持つこのオブジェクトがあります。このオブジェクトに対してCLargeOb
、移動セマンティクス (コンストラクターと演算子 =) を実装しました。次のように使用するのが理想的です。
void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals
m_largeOb2 = (CLargeOb&&)largeOb2;
}
ただし、オブジェクトを常に移動/破棄できるとは限らないため、次の 2 つの機能を追加しました。
void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = largeOb1;
m_largeOb2 = (CLargeOb&&)largeOb2;
}
void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1;
m_largeOb2 = largeOb2;
}
それは機能しますが、これらのオブジェクトを 3 つ以上パラメーターとして受け取る関数がある場合、*ss で大きな問題になることは既に推測できます...テンプレートを使用してこれを解決する賢い方法はありませんか? 「完璧な転送」?