2011-07-01 41 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_; }; template class foo:public HasName ...' – Tim

3

从技术上讲,是的,因为它们是属于不同类别的不同功能。实际上,也许,因为编译器/连接器非常聪明,并且已经发现在许多情况下这样的重复代码可以被压缩。并且总是存在这样的可能性,即它们没有完全内联,因此根本不需要存储实际的功能。

使用模板欺骗的可执行文件的大小有一定的代价,但现在不像以前那么多。