2016-05-23 69 views
3

我正在實現一個類,並且我想使用<將一些參數傳遞給實例<。如何重載運算符<<以便像ostream一樣的操作

例如,

terminal term; 
term << "Hello World!" << '\n'; 

代碼低於,

class terminal { 
    template <typename T> 
    terminal& operator << (T& t) { 
     std::cout << t; 
     return *this; 
    } 
}; 

基本上,我想是一個流的而不是流的一部分。 (未清點< <項;)

(對不起,我忘了說明我的問題) 的問題是,它用繩子效果不錯,但它編譯時失敗,如果有一個數字(如int,焦炭等)。

如果我們使用上面的例子中,編譯器會抱怨

無效的操作數的二進制表達式(「終端」和「INT」)

+2

什麼是你的代碼的問題? – Angew

+4

'T&t'使那個'const T&'應該被設置。 –

+0

你可以發佈產生錯誤的代碼嗎? – Angew

回答

1

我會改變以下內容,以便爲operator<<測序(例如,term << "hello" << std::endl;)工作:

namespace foo { 

class terminal {  
    std::ostream &strm; 
public: 
    terminal(std::ostream &strm_) : strm(strm_) {} 
    terminal() : strm(std::cout) {} 

    template <typename T> 
    friend std::ostream& operator<<(terminal &term, T const &t); 
}; 

template <typename T> 
std::ostream& operator<<(terminal &term, T const &t) { 
    term.strm << t; 
    return term.strm; 
} 

} 

Live Demo

+0

謝謝。這個實現考慮了ostream,比我的更好。 – 0xBBC

1

的問題是,你的operator <<取其通過引用非const的參數,這意味着它只能綁定到左值。所以像非字符串文字這樣的東西就沒有了。如果您不需要修改參數,請改爲const &。該語言有一個特殊的規則,允許左值引用const綁定到rvalues。

terminal& operator << (const T& t) { 
    std::cout << t; 
    return *this; 
} 

如果需要修改的參數,使用比<<不同的方法。在<<期間修改流式參數的類似流的接口將是非常違反直覺和維護的噩夢。