6

カンマ演算子のオーバーロードを非常に思いとどまらせるStackOverflowに関する他の投稿を見てきました。次のようなコンマ演算子のオーバーロードを伴うGithubプルリクエストが送信されました。

class Mylogger {
    public:
            template <typename T>
            Mylogger & operator,(const T & val) {
                    std::cout << val;
                    return * this;
            }
 };

 #define  Log(level,args...)  \
    do { Mylogger logv; logv,level, ":", ##args; } while (0)

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

 Log(2, "INFO: setting variable \", 1, "\"\n");

誰かがこれが良いまたは悪い使用例である理由を説明できますか?

4

3 に答える 3

6

<<を使用する方がはるかに理にかなっています。コンマは通常、ストリーム操作を意味するものではなく、コードを混乱させる結果になります。

于 2012-12-31T20:45:29.233 に答える
4

これは主観的ですが、セマンティクスが間違っているため、適切な使用例ではないと思います。出力に使用される演算子はすでに存在します<<が、より適切な選択です。

このコードは、オーバーロードされたコンマ演算子とともに可変個引数マクロを利用しています。これは賢く、特定の状況に適している可能性があります。ただし、Myloggerオブジェクトを作成する場所が1つである場合、オーバーロードされた演算子は混乱を招き、あらゆる種類の問題を引き起こします。

したがって、少なくとも、Mylogger実装の詳細である場合、それ有効なユースケースである可能性があります。現在、可変個引数関数テンプレートを備えたC ++ 11では、この種のねじれたコードに頼る必要はありません。

于 2012-12-31T20:46:41.490 に答える
0

演算子のオーバーロードは、使用法がクラスの呼び出し元/ユーザーに対して非常に透過的である場合にのみ行う必要があります。疑わしい場合は、必要なことを行うメソッドを作成し、適切な命名規則に従って名前を付けてください。通常、コンマの標準化された使用法はないため、コンマ演算子を追加すると、クラスのユーザーが頭を悩ませます。

最近、私は Google スタイル ガイドのファンになりましたが、これは演算子のオーバーロードの大ファンではありません。ここで学ぶことができるいくつかの本当に良い理由があります: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading

于 2013-07-28T08:46:41.467 に答える