2016-03-24 14 views
0

タイプライターの効果をシミュレートすることが可能かどうか疑問に思っていましたが(各文字の間に意味の一時停止)、coutグローバルクラスからです。coutは何を変更することはできますか?

例えば

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

は、同様の効果が

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

を持っているだろうがタイプライター機能に似たものにCOUTのグローバルクラスを変更することが可能ですか?

私はすべてのcoutをtypeWriter( "xxx")に変更することができますが、それは時間がかかります(数時間)。

+3

あなたは 'std :: cout'の代わりに' cout'を書いているのを見ました - あなたは 'using namespace std;'を使いましたか?この場合、 'cout'という名前のカスタムオブジェクトを' typeWriter'にリダイレクトすることができるので、実際には便利です。 – CompuChip

+1

'operator'をオーバーロードする' struct'を書くことができるので、 'cout'を' type_writer'で置き換えるだけでよいのです。置き換えを行うために '#define'を使うことさえできますが、それは良くありません。 – nwp

+0

@ Sergey A、Lol、私は毎日約30分しかないと仮定し、これまでには約10時間かかりました。私はそれが楽しいものではないと思っています。 – cow9000

答えて

2

std::coutはクラスではなく、静的オブジェクトです。それはstd::ostreamです。基になるストリームバッファを変更して、std::ostreamの動作を変更できます。あなたのストリームバッファーをstd::basic_streambuf<char>から派生させてください。これは、実装のためのベースとして古い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; 

今からの出力にそのタイプライタースタイルで書かれていなければなりません。

+0

ありがとう!私は家に帰るときにこれを試してみる。また、解明のためにありがとう – cow9000

+0

良い答え。地獄はどのように** 100ms **有効なC++ですか? – SolaGratia

+1

@BjarneStroustrup - そのニックで、あなたは知っている必要があります;-)これはC++ 14で始まる標準ライブラリで利用可能なユーザー定義リテラルです:http://en.cppreference.com/w/cpp/chrono/operator% 22%22ms – cdonat

関連する問題