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