2012-11-15 2 views
0

과 휴식.템플릿 기능은 내가 좋아하는 무언가로 정의되는 함수의 톤을 가진 새 할당

최근에 기본 할당자를 고객 할당 자로 변경해야했습니다. 나는

내가 가진이 평균이 다시 작성 않습니다 .. 모든 경우에 오버로드 된 할당을 사용하지 않는, 더 복잡하게 만들려면

template<typename T, typename Alloc> 
void myFunction1(vector<T,Alloc>& vin); 

: 이것은 내가에 정의를 변경하지 않는 한 모든 기능을 깰 것으로 보인다 두 개의 정의가있는 모든 함수, 하나는 할당 자의 템플릿과 할당자가없는 다른 정의가있는 함수입니까? 정말이 대답이 아니길 바래 ...

답변

1

전체 클래스 템플릿을 존중하는 하나의 함수 템플릿 만 있으면 충분합니다. 가설이 할 것 :

template <typename T, typename Alloc> 
void myFunction1(std::vector<T, Alloc> & v); 

모든 벡터는 두 인수의 할당 한 기본값 여부에 상관없이이있다. 당신은 각 기능 템플릿이 오버로드를 제공 할 필요가 없습니다

template <typename V> 
void myFunction1(V & v) 
{ 
    typedef typename V::value_type value_type; 
    // ... 
} 
+0

당신은 variadics에 갈 필요가 없습니다. 라이브러리 요구 사항에 따르면 두 개의 형식 인수를 취하는'vector'라는 템플릿이 있습니다. 구현시 추가 인수를 추가 할 수 있지만 'Vector '가 작동하지 않도록 할 수 없습니다. 문제가 생길 수있는 곳은 표준 라이브러리 유형에 대한 자신의 선언을 작성하려고하는 경우입니다. 표준 라이브러리 유형을 사용하는 것은 단순히 문서화 된대로 작동해야합니다. –

+0

@PeteBecker : 네 말이 맞아. 나는 "허용 된 추가 논쟁"이 당신을 물기 위하여 올 다른 상황 (전문화)를 생각하고 있었다. 이 글에서이 글을 삭제하겠습니다. –

+0

전문화에 대한 좋은 지적. 나는 그걸 생각하지 않았다. –

0

나는 당신이 너무 템플릿을 변경했다고 생각합니다. 은 그러나 좋은 소식은 당신이 당신의 템플릿을 변경할 수 있습니다 :

template <typename MyVector> 
void myFunction1(MyVector& vin); 
+0

물론이 변경은 '벡터'뿐만 아니라 모든 유형의 함수를 호출 할 수 있음을 의미합니다. –

2

표준 라이브러리 알고리즘에서 이루어집니다 같이 간단한 해결책은, 반복자의 측면에서 귀하의 기능을 구현할 수 :

template <typename Iterator> 
void myFunction1(Iterator1 first, Iterator2 last) { .... } 
0

:

그러나, 더 유익한 관용구는 전체 컨테이너를 템플릿을 만들기 위해 실제로. 두 개의 매개 변수를 제공하십시오. std::vector에는 두 개의 템플릿 매개 변수가 있으므로 둘 다 잘 추정됩니다.