1

C++ では、次の形式のシーケンスの終わりをプログラムでどのように検出しますか。

object << argument1 << argument2 << argument3;

このように operator<< をオーバーロードしたとしましょう

Object& operator<<(Object& object, Argument& argument) {
...
}

上記の式は次のように評価されます。

(((object << argument1) << argument2) << argument3);

議論のために、オブジェクトがロガーであるとしましょう。データをロガーにストリーミングします。最後の引数 (この場合は引数 3 ですが、もちろん引数の数は固定されていません) がオブジェクトにストリーミングされたら、オブジェクトにメッセージを組み立てて投稿してもらいます。次のようなものを書かなくても、どうすればこれを行うことができますか:

object << argument1 << argument2 << argument3 << EOM;

ありがとうございました。任意の入力を歓迎します。

4

3 に答える 3

4

他の回答が言及しているように、「メッセージの終わり」マーカーを使用することは良い設計です。

しかし、要求したものが本当に必要な場合は、次のようにすることができます: 通常どおりに EOM のアイデアを実装し、次にこのクラスを追加します。

class AutoEnd
{
private:
    mutable Object & m_obj;

public:
    explicit AutoEnd (Object & obj) : m_obj (obj) {}
    ~AutoEnd () {m_obj << EOM;}

    Object & obj () const {return m_obj;}
};

template <typename T>
AutoEnd const & operator << (AutoEnd const & ae, T && arg)
{
    ae.obj() << std::forward<T>(arg);
    return ae;
}

そして、次のように使用できます。

Object object;
...
AutoEnd(object) << argument1 << argument2 << argument3;

これはあなたが望むことをします。いくつかのメモ:

  • EOMを追加した後も明示的な方法を使用できることは明らかAutoEndです。これにより、必要に応じてどの方法でも柔軟に使用できます。
  • この手法の鍵は、AutoEndインスタンス化された行の最後で呼び出される のデストラクタです。
  • 上記よりもうまく実装できます。最も重要なことは、 のコンストラクターをAutoEndプライベートにするか、何らかの方法で の通常のインスタンスを作成してはならないことをユーザーに通知することAutoEndです。Object破壊されます。
  • この手法は、 for が例外をスローしない場合にのみ安全に使用できますoperator <<Objectこれは、デストラクタ内で呼び出され、デストラクタが をスローしてはならないためです。
  • AutoEndは一時オブジェクトとして使用するように設計されており、const &簡単に操作できるのは一時オブジェクトのみであるためoperator <<、定数参照を取得して返し、格納されたObject参照は として宣言されmutableます。私の意見では、これは悪い設計ではありAutoEndません。なぜなら、オブジェクトには ( を除いてObject &) 内部状態がなく、その呼び出しの正しさはoperator <<他の場所で保証する必要がある (つまりAutoEnd、それを気にする必要がない) からです。
  • AutoEndコピー不可にする必要があります。
于 2013-06-16T07:39:35.887 に答える
0

なぜシーケンス表記が可能なのか考えてみてください。operator<<ストリームへの参照を返すため、それは起こりました。あなたは書ける:

ostream& s = object << argument1;
s << argument2
s << argument3
...

そして、シーケンスの本当の最後はどこですか?設計してコーディングするのはあなただけです。EOM良い一般的な慣行も同様です - それを使用してください。

于 2013-06-16T07:17:21.803 に答える
0

あなたはできません(object各行の後に破壊されない限り)。のようなものを持っていることは非常に一般的ですEOM

于 2013-06-16T07:02:17.593 に答える