2010-04-22 34 views
2

我有一個是從ostream的派生類:創建ostream的操縱特定類

class my_ostream: public std::ostream 
{ 
    // ... 
} 

我想打一個操縱(例如do_something),該工程具體到這個類,像這樣:

my_ostream s; 
s << "some text" << do_something << "some more text"; 

我做了以下內容:

std::ostream &do_something(std::ostream &os) 
{ 
    my_ostream *s = dynamic_cast<my_ostream*>(&os); 
    if (s != NULL) 
    { 
     // do something 
    } 
    return os; 
} 

這工作,但比較難看。我試過以下內容:

my_ostream &do_something(my_ostream &s) 
{ 
    // do something 
    return s; 
} 

這不起作用。我也嘗試了另一種方法:

class my_ostream: public std::ostream 
{ 
    // ... 
    my_ostream &operator<<(const do_something & x) 
    { 
     // do something 
     return *this; 
    } 
} 

這仍然不起作用。

回答

3

您需要在您的類中添加用於操縱支持:

#include<iostream> 
class my_ostream : public std::ostream 
{ 
    public: 
    std::string prefix; 

    my_ostream():prefix("*"){} 

    // manipulator support here: 
    my_ostream& operator<<(my_ostream&(*f)(my_ostream&)){ 
     f(*this); 
     return *this; 
    } 
}; 

my_ostream& operator<<(my_ostream &st, const std::string &s){ 
     std::cout << st.prefix << s; 
     return st; 
} 

// manipulator: clear prefix 
my_ostream& noprefix(my_ostream &st){ 
    st.prefix=""; 
} 

int main(){ 
    my_ostream s; 
    std::string str1("text"); 
    std::string str2("text"); 
    s << str1 << noprefix << str2; 
} 
+0

我試了一下,這是行不通的。它編譯,但不調用操縱函數。我覺得這很奇怪,因爲它正是在'std :: ostream'中完成的。 – petersohn 2010-04-22 11:48:31

+0

@petersohn:它必須是你的編譯器的問題,因爲上面的代碼適用於我,因爲它(g ++ 3.4.4) – catwalk 2010-04-22 12:11:09

+0

我只是想補充一點,我一直在尋找這個答案的整個一天,這只是按預期工作(g ++ 4.7.0)。 – cubuspl42 2012-08-13 22:22:24