2011-10-12 35 views
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編寫具體的新代碼,每類

自從我加入

  • 類似的流類又不是非常的混入的使用經歷,而且往往違反偶爾編碼規則,我想知道,如果這是一個混合或如何一個可以獲得與另一個更適合的技術類似的效果的適當使用。

    非常感謝,馬丁

  • 回答

    2

    如果他們能寫scanprint模板的功能,那不如直接寫模板化運營,跳過此整個傻混入業務。

    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過載看起來完全沒有必要和錯誤。

    +0

    恕我直言:全模板化的流運營商如你建議可以讓你變成大麻煩,因爲我是前段時間告訴和經歷了太多http://stackoverflow.com/questions/4195764/is-there-a-warning-free-模板函數對轉換,基本類型到字符串。 – Martin

    +0

    進一步QDebug是很方便用於調試(無chache,紅色,所有的數據類型QT已經支持...)。不幸的是,它不能用正常的語法重載。寫「qDebug()<<」作爲Qt框架提出了一個必須去http://doc.qt.nokia.com/latest/qdebug.html提議的方式。 – Martin

    +0

    同樣對於你的模板,你仍然需要調用訪問器或者讓它們成爲朋友。 – Martin