私が一般的なコードで作業している多くの学生は、適切なストリーム演算子のオーバーロードを理解するのに問題があるため、コードを容易にし、正しい演算子の実装を保証するために、ヘルパーテンプレート(これが実際のミックスインであるかどうかはわかりません)を作成しようとしました。ここに来る:
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との緊密な結合が含まれます
アップ:
- できます ;-)
- 同様のストリームクラスは、すべてのクラスを変更せずに、すべてのクラスに特定の新しいコードを記述せずに追加できます。
私はミックスインの使用経験があまりなく、コーディングガイドラインに違反することがあるので、これがミックスインの適切な使用法であるかどうか、または他のより適切なものと同様の効果を得る方法を知りたいです技術。
どうもありがとう、マーティン