2016-01-19 82 views
2

這樣的函數存在:取代現有運營商<<:覆蓋現有的實施

std::ostream& operator<< (std::ostream &out, const boost::dynamic_bitset<> &v) { 
    for (unsigned i = 0; i < v.size(); ++i) { 
    out << int(v[i]); 
    } 
    return out; 
} 

希望覆蓋它,使用這樣的事情。 :)

std::ostream& operator<< (std::ostream &out, const boost::dynamic_bitset<> &v) { 
    for (unsigned i = 0; i < v.size(); ++i) { 
    if (i && v[i]) { 
     out << ", " << i; 
    } 
    } 
    return out; 
} 

顯然C++不會允許這樣做。你如何克服這一點,並使用另一種日誌記錄功能?

+0

由於C++中「override」的具體含義,我已經將標題更改爲「supercede」。 –

+0

@AmiTavory如何取代XYZ操作符;覆蓋當前現有的定義?'。我喜歡使用正確的術語,所以imho supersede比替代(覆蓋的重載意義)更好。 – zehelvion

+0

@zehelvion在那裏我們去:-) –

回答

4

與@ Bathseba的(正確)答案相反,我會避免從類繼承:它從來沒有真正微不足道,因爲您可能需要幾個ctors,您可能希望希望在不同的設置中重定向不同,可能會有其他操作您希望專注於此(如此處的重定向)等等。

相反,我會創建一個類只是重定向:

struct my_redirector 
{ 
    my_redirector(const whatever &w) : m_w(w) {} 
    const whatever &m_w; 
}; 

std::ostream &operator<<(std::ostream &&os, const my_redirector &r) 
{ 
    // whatever you want 
    return os; 
} 

,你會使用如:

whatever w; 

cout << my_redirector(w) << endl; 

的代碼足夠短才能看到,一目瞭然,爲什麼你創建了這個類。

+0

這是關於構造函數的好處。儘管後來的C++標準避免了這種情況。 – Bathsheba

+0

@Bathsheba所以這是一個值得回答的iyho?對於初學者和中級程序員來說,代表大多數用戶可能在這樣一個主觀上微不足道的問題上尋找答案的中間程序員,對我來說這似乎是確鑿而簡短的,對於這些問題的答案來說, – zehelvion

+0

謝謝,@Bathsheba - 當然你是對的。順便說一句,我對你寫了很長時間的答案印象非常深刻。 –

2

從boost類繼承,確保v是那種類型,並定義相關的運算符。

不幸的是,C++不允許你定義一個函數。