0

本「Essential C++」(より具体的には、パート 2.7) で、著者はテンプレート関数の使用法について次の例で簡単に説明しています。この例では、診断メッセージが表示され、ベクトルの要素を反復処理します。

template <typename T> 
void display_message(const string& msg, const vector<T>& vec)
{
    cout << msg; 

    for (int i = 0; i < vec.size(); ++i)
        cout << vec[i] << ' '; 
}

この例に興味を持ったのは、私 (おそらく他の多くの愛好家の開発者と同じように) は、ほとんどのアプリケーションで標準入出力ストリームが通信とデータ処理に使用されていることを常に当然のことと思っていたからです。次に著者は、display_message を実装するこの方法はより柔軟であると述べています。この柔軟性が、いわば「光る」状況の例を教えてください。言い換えれば、オプションの 3 番目のパラメーターが別の入出力表現 (たとえば、組み込みデバイス) を取る場合がありますか、それとも、単純な構造で使用されることになっている単純な追加にすぎませんか?私が説明しようとしている状況?

編集:@Matteo Italiaが気づいたように、これは関数宣言です

void display_message(const string&, const vector<T>&, ostream& = cout); 
4

1 に答える 1

0

この関数で利用できる 2 つの「柔軟性」を混同しています。

  • テンプレート部分(著者が話している部分だと思います)を使用すると、ストリームに出力できるstd::vector<T>任意のものを渡すことができます。Tつまり、integer、double、またはカスタムオブジェクトのベクトルを渡すことができ、関数は指定されたストリームに喜んで出力します。1

  • ストリーム部分 (注意を引いた) は、代わりに、出力部分に任意の (狭い) 出力ストリームを指定できるようにするためのものです。メッセージ (およびベクトル) を他のストリームに出力したい場合があるため、便利です。たとえば、それが必要なエラー メッセージの場合cerr。そして、最も重要なことは、ファイルに書き込む場合は、ファイル ストリームを渡すことです。


ノート

  1. より多くの「STL 2ライクな」インターフェースでは、通常、そのようなベクターは受け取らないことに注意してください。実際、標準ライブラリは、この問題を解決するためにさらに抽象的な方法を好みstd::ostream_iteratorます ( を使用するstd::copyと、コンテナー イテレーターから出力ストリームにデータをコピーできます)。
  2. ニッチピッカーへ:私は知っています、そしてあなたは私を納得させません.
于 2013-10-12T13:57:19.673 に答える