2011-07-01 7 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_; }; 템플릿 클래스 foo : 공용 HasName ...' – Tim

3

기술적으로는 별개의 클래스에 속하는 별개의 기능이기 때문에 그렇습니다. 컴파일러/링커는 꽤 영리하고 많은 경우에 이러한 반복 코드가 압축 될 수 있기 때문에 실제적으로는 어쩌면 가능할 것입니다. 그리고 실제 기능을 전혀 저장할 필요가 없도록 완전히 인라인되지 않았을 가능성이 항상 있습니다.

템플릿 속임수를 사용하기위한 실행 가능한 크기에는 확실한 비용이 있지만 과거에는 그다지 많지 않습니다.

관련 문제