0

私はこのようなクラスを持っています:

template<typename T>
class MyClass
{
    public:
        // ...
              T && operator()(uint64_t i, uint64_t j);  // I want to add a member function like this.
              T &  operator()(uint64_t i, uint64_t j);
        const T &  operator()(uint64_t i, uint64_t j) const;
        // ...
};

Tコードを修正しているときに、オブジェクトを位置に設定しようとするたびに、タイプの格納されたオブジェクトがコピーされていることに気付きました(i,j)。移動セマンティクスを使用して、可能であればこの不要なコピーを回避したいですか? 上記のコードのように 3 番目の演算子を追加することでこれを解決することは可能ですか?

私の目的はMyClass、コードで次のようなインスタンスにアクセスすることです。

MyClass<Element> myclass;
// ...
Element element;                        // 'Element' is movable.
// ...
myclass(2, 3) = std::move(element);     // 'element' is no longer needed, it can be moved.

これどうやってするの?

4

1 に答える 1

1

まず、戻り値の型に基づいてオーバーロードすることはできません。ただし、添字演算子の余分なオーバーロードは必要ないため、これは問題ではありません。

不要なコピーを避けるために、またオブジェクトは移動可能であるため、直接割り当ての代わりにclass Element使用できます。std::swap

std::swap(myclass(2, 3), element);

C++11std::swapは移動セマンティクスを使用するため、不要なコピーを回避します。

于 2015-10-15T06:49:30.827 に答える