2

次のC++コードについて考えてみます。

A a = ...;
B b = ...;
C c = ...;

cin >> a >> b >> c;
...
cout << a << b << c;

C ++ 11の可変個引数テンプレート関数(私は思う)ができたので、次のいずれかの方法で実装できたはずです。

cin.read(a,b,c);
cout.write(a,b,c);

read(cin,a,b,c);
write(cout,a,b,c);

cin(a,b,c);
cout(a,b,c);

これらの方法に比べてチェーン<<オペレーターの利点はありますか?別の言い方をすれば、最初に可変個引数テンプレート関数があったとしたら、まだ使用operator <<していたと思いoperator >>ますか?もしそうなら、なぜですか?

4

1 に答える 1

5

iostreamの最も重要な側面の1つは、拡張可能であるということです。新しいタイプを追加することができ、あなたがする必要があるのは<<、書き込みと>>読み取りのためにオーバーロードを提供することだけです。

可変個引数バージョンにも同様のメカニズムを提供する必要があります。

とによる引数依存のルックアップによって呼び出される、グローバルまたは名前空間スコープの関数名を指定する必要がistream::readありostream::writeます。この関数の名前は明確に定義する必要があります。しかし、その関数の名前はまったく見つかりませんcin.read(a,b,c);。そうでない限りread、名前の競合の問題が発生する可能性があります。

このメカニズムは、オーバーロードよりもすぐにはわかりませんoperator<<。オーバーロードを書き込む関数の名前が何であるかを知るためにドキュメントを検索する必要がありますがoperator<<、ステートメントには次のようなものがありますcout << ...

于 2012-08-05T22:42:10.727 に答える