2011-07-01 2 views
3

実際に汎用部品を使用しているもののみですか?この例のようにテンプレートクラスの場合、非汎用メンバ関数は重複しますか?

template<class T> 
class foo 
{ 
public: 
    void addStuff(int x,T y) 
    { 

     ints_.push_back(x); 
     generics_.push_back(y); 
    } 
    void clear() 
    { 
     ints_.clear(); 
     generics_.clear(); 
    } 
    void setName(std::string name) 
    { 

     name_ = name; 
    } 

    std::string name_; 

    std::vector<int> ints_; 
    std::vector<T> generics_; 
}; 

非ジェネリックの機能は、専門を必要とする.cppファイルでそれらを入れているため、インラインです。 Doeも複製されますか? ちょうど興味深い...

答えて

4

テンプレートパラメータを介して作成される各クラスは、独自のクラスです。つまり、foo<int>foo<double>およびfoo<char>の場合、3つの異なるaddStuff、clearおよびsetName関数が存在します。それは3つの異なるクラスがあるからです。テンプレートはコンパイル時のエンティティです。これらはコンパイル時に導入され、このようなコードサイズを「縮小」する試みはありません。

+2

本当にしたい場合は、テンプレート以外の基本クラスをいつでも作成できます。 setNameにはあまり意味はありませんが、他の状況ではもっと役に立ちます:class HasName {public:void setName(const std :: string&name){name_ = name; } std :: string name_; };テンプレート class foo:public HasName ... ' – Tim

3

技術的には、これらは別個のクラスに属する別個の機能であるため、はいです。実際には、おそらく、コンパイラ/リンカはかなりスマートなので、このような繰り返しコードは多くの状況で凝縮することができると考えています。実際の機能をまったく格納する必要がないように完全にインライン化されていない可能性が常にあります。

テンプレートトリッキーを使用するための実行可能なサイズには明確なコストがありますが、これまでの数年とは異なります。

関連する問題