0

私は、次の構成によって現在達成していることをうまく行うデザインパターンがあるかどうか疑問に思っています:

入力オブジェクトのセットに基づいて作成したいオブジェクトがあります。私の特定のケースでは、それらはストリームのようなオブジェクトです。計算中は非常に多くの状態を追跡する必要があるため、関数パラメーターとして渡したくないだけでなく、計算の値が必要な名前空間を汚染したくありません。だから私がやっていることは、おおよそ次のようなクラスを作成することです:

class objectCreator {
public:
  objectCreator(stream_type & stream) : stream(stream) {
    create();
  }

  std::unique_ptr<value_type> get() { return std::move(result); }

private:

  void
  create() { /* ... */ }

  std::unique_ptr<value_type> result;
  stream_type & stream;

  // various state holding variables
};

私の問題は、明らかにget()2 回呼び出しても意味がないことです。すでに呼び出されているかどうかを確認することで、それを防ぐことができますが、本質的に2回呼び出すことを防ぐ構造を使用したいと思います。(注: 私はすでにこのオブジェクトをどこかの関数呼び出しでラップしており、他の場所では使用しないでください。しかし、それは美しくありません。)

4

1 に答える 1

1

基本的に、get()オブジェクトから移動します。ユーザーにこれを実行させる最善の方法は、ユーザーが を呼び出す前にオブジェクトを移動するよう要求することget()です。これは、右辺値参照で修飾されたメンバー関数で行われます。

std::unique_ptr<value_type> get() && { return std::move(result); }

これは として呼び出す必要がありますstd::move( obj ).get()。単にobj.get()うまくいかないでしょう。

もちろんmove、右辺値を必要とすることは決してないのでobjectCreator( … ).get()、一方ではうまくいきます。

この言語機能のコンパイラ サポートはまだ提供されていないため、アップグレードや Clang への移植が必要になる場合があります。

于 2013-06-26T07:32:09.207 に答える