1

如何捕获 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 <<.
}

我知道这看起来很愚蠢,但我真的很想知道它是如何完成的。我看到 boost 通过执行 Format("%20") % SomeVar 做了类似的事情

但我想弄清楚如何使用插入运算符和逗号运算符来做到这一点。有什么想法或类似的吗?

4

1 回答 1

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.

于 2013-04-01T03:55:47.500 回答