2013-04-01 39 views
1

我怎樣才能捕捉COUT的輸入?捕獲和格式化COUT

例子:

如果我輸入:

std::cout<<"Some normal text here" << fout <<"Test %, %", 1, 2<< "works 100% fine."<<std::endl 

那麼它會打印: 「這裏有些普通的文本測試1,2工程100%的罰款」

因爲運算符爲< <,所以100%未格式化。只有在fout之後的東西纔會被格式化,直到它遇到運算符< <。

我可以這樣做嗎?

#include <iostream> 
#include <sstream> 
#include <vector> 
#include <algorithm> 


std::ostream& fout (std::ostream& I) 
{ 
    //Some how format my text here.. Then return it as the ostream. 
    return I; 
} 

int main(int argc, char* argv[]) 
{  
    std::cout<< fout << "Test %", 1 << "Other stuff 20%."; 
    //So Anything after fout<< should be stolen and formatted then given back to cout.. Other stuff 20% isn't formatted because of the <<. 
} 

我知道這似乎很愚蠢,但我真的很想知道它是如何完成的。我看到升壓的確做格式(「%20」)%SomeVar

類似的東西,但我想弄清楚如何與插入操作,並使用逗號運算符做到這一點。任何想法或類似的東西?

+0

注意,你必須做'<<(FOUT <<「測試%」,1)<<'這個工作就像你想讓它。逗號運算符的優先級較低。 – chris

+0

沒關係。我不介意這樣做,但如何?我是否正確捕獲了ostream?我似乎無法獲取數據。這將如何與逗號運算符一起工作?結合逗號和插入是我無法弄清楚的。 – Brandon

+0

我認爲讓'fout'返回一個可以隱式轉換爲字符串的類型是可行的。您可以使用該類型的自定義'運算符''重載,以便每次獲取前一個字符串並填充它,然後依賴隱式轉換爲字符串或重載'operator <<'。 – chris

回答

2

您需要定義一個新的類型,請<<,運營商唯一努力。

就是這樣。

struct fout 
{ 
    // To establish the formatting string (returns *this) 
    fout& operator << (const std::string &format_string); 

    // To insert data into the formatted string (returns *this) 
    template < typename T > 
    fout& operator , (const T &data); 

    // To produce a type that can be sent to std::cout, etc. 
    operator std::string(); 
}; 

這將允許這樣的代碼:

cout << "Normal text " << (fout() << "Test %, %", 1, 2) << "works"; 
//        ^^ A fout object is being constructed here. 

如果你不喜歡這些括號,重命名結構並創建一個名爲fout一個實例。

+0

我錯過了什麼嗎?我無法編譯它在g ++ 4.7 – gongzhitaao

+0

@ gongzhitaao也許?用'#include '和一個'int main(){}'在ideone.com上編譯 –