2014-07-05 4 views
1

이 템플릿 함수가 있습니다. (나는 어딘가에서 비슷한 것을 본 기억이 있습니다.) std::functionstd::list (모두 Container)에서 작동합니다. 그러나 구문 template <typename, typename...> class Container을 실제로 이해할 수는 없습니다. <>은 (C/old C++에 비해) 다른 언어로 보입니다. 누군가 그것을 설명하거나 이것을 설명하는 좋은 참고서를 줄 수 있습니까?가변 템플릿 템플릿 매개 변수 구문

template <typename T, template <typename, typename...> class Container> 
static bool contained(const T & x, const Container<T> & xs) { 
    return std::find(xs.begin(),xs.end(),x) != xs.end(); 
} 
+1

약간의 수정이 흥미로울 수 있습니다. [(여기 참조)] (https://ideone.com/DhELF7). 그리고 이것은 libC++에 대한 clang3.4와 함께 컴파일되지 않을 것이라는 점에 유의하십시오 (그러나 libstdC++와 연동 가능). 차이점은'std :: list'가 어떻게 구현되는지에 있습니다. variadic 매개 변수 팩을 추가하면이 문제를 해결할 수 있으며 첫 번째 매개 변수와 비교 한 결과는 [(여기 참조)] (https://ideone.com/2K2u5n)을 검토 할 가치가 있습니다. – WhozCraig

+0

실제로. 알고있는 것이 좋다. – tinlyx

답변

2
template <typename T, template <typename, typename...> class Container> 

Container는 함수 템플릿 통과 Container 유형 자체가 적어도 하나의 템플릿 인수를 템플릿되어야한다는 것을 의미 템플릿 템플릿 파라미터임을 나타낸다 - 번째 템플리트 인수는 매개 변수 팩 (typename...)에 의해 소비됩니다.

하지만 기능 템플릿에 문제가 있습니다. 앞에서 설명한 것처럼 Container은 하나 이상의 템플릿 인수를 사용하는 클래스 템플릿이어야하지만 해당 함수 매개 변수 (xs)는 단일 템플릿 인수를 사용한다는 것을 나타냅니다. std::list 또는 std::vector 또는 std::deque과 함께 작동하는 이유는 각각의 두 번째 템플릿 인수 인 할당 자 유형에 기본값 (std::allocator<T>)이 있기 때문입니다. 함수 템플리트는 기본값이 아닌 할당 자 유형이있는 경우 이들 컨테이너 중 하나와 작동하지 않습니다.

수정하려면 xs 유형에 추가 템플릿 인수도 있어야합니다.

template <typename T, typename... Params, 
      template <typename, typename...> class Container> 
static bool contained(const T & x, const Container<T, Params...> & xs) { 
    return std::find(xs.begin(),xs.end(),x) != xs.end(); 
} 

이 특정 문제 그러나, 템플릿 템플릿 매개 변수를 사용하지 않고 해결할 수 있습니다. 템플리트에 규정을 두지 말고 모든 유형 Container을 승인하십시오. 검색하려는 요소의 유형은 Container::value_type 중첩 유형을 사용하여 지정 될 수 있습니다.이 중첩 유형은 표준 라이브러리의 모든 컨테이너가 정의합니다. 또한

template <typename Container> 
static bool contained(typename Container::value_type const& x, 
         const Container& xs) { 
    return std::find(xs.begin(),xs.end(),x) != xs.end(); 
} 

는, C++ (11)는 contained() 함수로 같은 일을 std::any_of을 추가했다.

+0

+1. 명확한 설명 주셔서 감사합니다. – tinlyx

관련 문제