3
由於許多學生與我共同工作的代碼有一些問題理解正確的流運算符重載,我試圖創建一個輔助模板(不知道這是否是一個真正的混合)來促進代碼並確保操作者的正確實施。這裏說到:使用一個混合(?),使流I/O更容易
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;
}
}
據我看到他們在目前的這種實現的缺點:
- 不會爲第三方類型 工作
- 包括繼承,因此緊耦合與IoClass雖然不是每一個用戶可能需要 木衛一某種類型 個
跌宕:
- 它工作;-) 可以在不改變所有類和withou編寫具體的新代碼,每類
自從我加入
非常感謝,馬丁
恕我直言:全模板化的流運營商如你建議可以讓你變成大麻煩,因爲我是前段時間告訴和經歷了太多http://stackoverflow.com/questions/4195764/is-there-a-warning-free-模板函數對轉換,基本類型到字符串。 – Martin
進一步QDebug是很方便用於調試(無chache,紅色,所有的數據類型QT已經支持...)。不幸的是,它不能用正常的語法重載。寫「qDebug()<<」作爲Qt框架提出了一個必須去http://doc.qt.nokia.com/latest/qdebug.html提議的方式。 – Martin
同樣對於你的模板,你仍然需要調用訪問器或者讓它們成爲朋友。 – Martin