3

私が一般的なコードで作業している多くの学生は、適切なストリーム演算子のオーバーロードを理解するのに問題があるため、コードを容易にし、正しい演算子の実装を保証するために、ヘルパーテンプレート(これが実際のミックスインであるかどうかはわかりません)を作成しようとしました。ここに来る:

template<typename T> struct IoEnabled {
  friend std::ostream& operator<<(std::ostream& out, T const& val) {
    return val.print(out);
  }

  friend std::istream& operator>>(std::istream& in, T& val) {
    return val.scan(in);
  }

  friend QTextStream& operator<<(QTextStream& out, T const& val) {
    return val.print(out);
  }

  friend QTextStream& operator>>(QTextStream& in, T& val) {
    return val.scan(in);
  }

  friend QDebug operator<<(QDebug dbg,T const& val){
    std::stringstream myStream;
    myStream << val;
    dbg.nospace() << myStream.str().c_str();
    return dbg;
  }
};

クラスの継承:

class Foo: private IoEnabled<Foo> {
  protected:
   int mData;

  public:
    template<typename U>
    U& scan(U& in) {
      in >> mData;
      return in;
    }

    template<typename U>
    U& print(U& out) const {
      out << mData;
      return out;
    }
}

私が現時点で見ている限り、この実装の欠点は次のとおりです。

  • サードパーティタイプでは機能しません
  • すべてのユーザーが特定のタイプのIoを必要とするわけではありませんが、継承が含まれているため、IoClassとの緊密な結合が含まれます

アップ:

  • できます ;-)
  • 同様のストリームクラスは、すべてのクラスを変更せずに、すべてのクラスに特定の新しいコードを記述せずに追加できます。

私はミックスインの使用経験があまりなく、コーディングガイドラインに違反することがあるので、これがミックスインの適切な使用法であるかどうか、または他のより適切なものと同様の効果を得る方法を知りたいです技術。

どうもありがとう、マーティン

4

1 に答える 1

2

関数を記述scanしてprintテンプレート化できる場合は、テンプレート化されたオペレーターを直接記述して、このばかげた mixin ビジネス全体をスキップすることもできます。

struct Foo {
    int mData;
    Foo() : mData(mData) {}
};

template <typename OutputStream>
OutputStream& operator<<(OutputStream& stream, const Foo& data) {
    stream << data.mData;
    return stream;
}

template <typename InputStream>
InputStream& operator>>(InputStream& stream, Foo& data) {
    stream >> data.mData;
    return stream;
}

また、その特殊なケースの QDebug オーバーロードは、まったく不要で間違っているように見えます。

于 2011-10-12T15:43:20.257 に答える