捕获和格式化cout

时间:2013-04-01 03:24:44

标签: c++

如何捕获cout的输入?

示例:

如果我输入:

std::cout<<"Some normal text here" << fout <<"Test %, %", 1, 2<< "works 100% fine."<<std::endl
然后它会打印出来:

  

“这里的一些正常文本测试1,2,100%正常工作。”

100%未格式化,因为&lt;&lt;运营商。只有fout之后的东西才会被格式化,直到它遇到&lt;&lt;操作

我能这样做吗?

#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 <<.
}

我知道这看起来很傻但我真的想知道它是如何完成的。我看到通过执行Format(“%20”)%SomeVar

来提升类似功能

但我想弄清楚如何使用插入运算符和使用逗号运算符。任何想法或类似的东西?

1 个答案:

答案 0 :(得分: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的实例。