有可能改变cout的作用吗?

时间:2016-03-24 14:32:09

标签: c++

我想知道是否可以模拟打字机效果(意味着在每个字符之间暂停。)但是来自cout全局类。

例如

cout << "Hi, this is a cow." << endl;

具有相同的效果

typeWriter("Hi, this is a cow.\n");

是否可以将cout的全局类更改为类似于typeWriter函数的内容?

我知道我可以将所有cout更改为typeWriter(“xxx”),但这需要很长时间(几个小时)。

1 个答案:

答案 0 :(得分:2)

std::cout不是一个类,而是一个静态对象。这是std::ostream。您可以通过更改基础streambuffer来更改std::ostream的行为。从std::basic_streambuf<char>导出你的streambuffer。它可能使用旧的streambuff作为实现的基础,只需添加输出的减速:

class TypeWriterStreambuf: public std::basic_streambuf<char> {
    public:
        TypeWriterStreambuff(std::basic_streambuf<char>* base, 
                             std::chrono::milliseconds delay) : // ...
};

然后替换std::cout之一:

using namespace std::chrono_literals;
auto b = new TypeWriterStreambuff{std::cout.rdbuf(), 100ms};
std::cout.rdbuf(b);

std::cout << "Hello World" << std::endl;

从现在开始,输出应该以打字机的形式写出来。