2017-01-20 6 views
-1

問題:デフォルトの<<演算子をvector<int> v変数にオーバーロードすると、cout << vは各要素を順番に出力します。明らかにこれは、要素のいずれかのタイプのために働く必要がありますprevious questionテンプレートを定義する/しないC++のオーバーロード演算子

template<typename T> 
std::ostream& operator<<(std::ostream& s, std::vector<T> t) { 
    s << "["; 
    for (std::size_t i = 0; i < t.size(); i++) { 
     s << t[i] << (i == t.size() - 1 ? "" : ","); 
    } 
    return s << "]" << std::endl; 
} 

にジェイソン・アイバーソンによって提案されたようにここで私は私がintを持つ唯一の心配があるため、一つの選択肢を見て、私は

ostream& operator << (ostream &os, const vector<int> &v){ 
    for (auto x: v){ 
     os << " " << x; 
    } 
    return os; 
} 
としての機能を簡素化

それはうまく動作します。

は、だから私の質問は限りvector<int> vに関しては

  1. で、templateを使用していないの注意点は何ですか?
  2. 汎用性とは別に、Jasonのソリューションの利点は何ですか?

ありがとう!


深い思考: 上記の質問が悪い言葉で表現して、コメントのおかげで、私はそれを修正してくださいすることは理にかなって考えています。 質問:C++でtemplateシングルタイプの関数で十分な場合はどうすればいいですか? @Marco A@Walterから


クレジットは、この質問を閉じることができました。

+4

「テンプレート」は何ですか?もしそうなら、あなたはなぜそれを求めているのですか? – Walter

+0

あなたは過負荷を書く必要はありませんが、それ以来の利点は何ですか? – NathanOliver

+0

@Walter 'template'は知っていますが、' T'型を指定しない方が一般的であることを除けば、その利点を理解したいです。 – wenduowang

答えて

0

C++の主なポイントの1つは、generic programmingtemplateです。

利点は非常に明白です:同一または類似のコードを複数回書く必要はなく、同様のコードをデバッグ/保守する必要はありませんが、1つだけです。 (これはあなたのカテゴリー「一般目的」に該当するので、それ以上の利点はありません)。

templateは機能(またはクラス)ではないため、実際にはいくつかの欠点があります。関数(またはクラス)は、コンパイル時にtemplateから実際に使用されたときにのみ作成されますが、テンプレート以外の関数は事前コンパイルされます。これには次の2つの意味があります。(1)コンパイルがより多く、(2)コード内の特定の構文エラーは、templateが使用できない引数でのみ使用された場合にのみ発生します。投稿内のtemplateは、たとえば​​が定義されていないとコンパイルされません。

+0

このような汎用性を欠くという欠点はありますか、それとも狭い範囲の機能を定義するのと同じコストがかかりますか? – wenduowang

+0

@wenduowang私の更新答えを見てください。 – Walter

+0

ありがとう!これは明らかです。 – wenduowang

関連する問題