2015-01-16 68 views
0

我來自ActionScript,所以我不那麼熱衷於C++。但我認爲這可以實現,但我不知道如何。自定義ostream,將調用函數與字符串作爲參數

我正在使用一個庫,將聲明ostream作爲標準輸出。現在,在所有示例中,ostream被設置爲cout,但我想自己處理該字符串。

我是遊蕩,如果有可能,一旦庫做ostream << "string" ,我得到這樣的

function handleString (string output){ 
// handle output 
} 

,這樣我可以在這裏處理。


如何設置ostream以字符串作爲參數調用該函數?


來自lib的示例。

在頭我有

class Lib { 
ostream* m_Output; // The output stream 

...實施例使用的lib,它是如何設置輸出例如CLI應用的

*m_Output << "Some string output" << endl; 

public: 
    inline void SetOutputStream(ostream* o){ m_Output = o; m_Output->precision(2); *m_Output << fixed; } 

實施例流

Validator->SetOutputStream(&cout); // Set output to std::cout 

我想要做這樣的

Validator->SetOutputStream(ostreamObjectThatWillCallMyFunctionAsString); 
+0

您遇到了什麼問題?在問題中明確提到問題。 – doptimusprime

+0

做了它,更清楚地添加了 – Tree

回答

0

從看來你只是想建立一個字符串,這個過程的描述。你可以這樣做,使用字符串流:

#include <iostream> 
#include <sstream> 
void f(std::ostream& out) { out << "f()"; } 
int main() { 
    std::ostringstream out; 
    f(out); 
    std::cout << "string='" << out.str() << "'\n"; 
    f(std::cout); 
} 

如果你想有一個在特定事件發生在一個流,例如,當它被刷新自動調用的函數,你會使用自定義流緩衝和創建與std::ostream。我只能在刷新或者換行上調用函數。否則,你要麼接到每個角色的呼叫,要麼有些不可預知的行爲。下面是一個簡單的例子:

class funbuf: 
    public std::streambuf { 
    std::string buffer; 
    std::function<void(std::string const&)> fun; 
public: 
    funbuf(std::function<void(std::string const&)> fun) 
     : fun(fun) {} 
    int overflow(int c) { 
     if (c != std::char_traits<char>::eof()) { 
      buffer.push_back(c); 
      // this->fun(this->buffer); // for each char 
     } 
     return std::char_traits<char>::not_eof(c); 
    } 
    int sync() { 
     this->fun(this->buffer); 
     return 0; 
    } 
}; 
void process(std::string const& s) { 
    std::cout << "process(" << s << ")\n"; 
} 
int main() { 
    funbuf sbuf(&process); 
    std::ostream out(&sbuf); 
    out << "one " << 1 << "\n" << std::flush; 
    out << std::unitbuf << "three " << 3 << '\n'; 
} 

因此應該是一個工作示例(這是未經測試,輸入一個電話,即可能與錯別字百出)。演示顯示使用std::unitbuf明確和隱含地清除流。可以通過添加容易實現的功能來重置緩衝區,其中一種可能是重置緩衝區

this->buffer.clear(); 

在一個戰略點。同樣,如果字符串爲空,則可以避免調用該函數。

+0

但是每次Lib產生一個輸出流時,這都不會調用'f'。或者我錯了? – Tree

+0

正確。如果你想在每次輸出時調用一個函數,你可以創建一個流緩衝區並覆蓋'overflow()'和'sync()'方法。 –

+0

這是我想要的方法,但我沒有這麼好的C++,所以我需要一些時間來實現它在我的情況:)但是這回答了我的問題,而streamBuffer就是我一直在尋找 – Tree

0

東西,如果我得到你的權利,你可能想超載< <操作。 這應該工作:

class Lib 
{ 
    std::ostream *m_Output; 

    friend std::ostream& operator<<(const Lib &, const std::string &); 
}; 

std::ostream& operator<<(const Lib &lib, const std::string &s) 
{ 
    if(lib.m_Output) 
    { 
     lib.m_Output->write(s.c_str(), s.length()); 
    } 

    return *lib.m_Output; 
} 
+0

可能,我會嘗試:) – Tree

+0

這將崩潰,因爲你在「operator <<」裏面調用「operator <<」,這是一個無限遞歸。 – Windoze

+0

是的顯然是我的不好,將編輯 – Axalo

相關問題