2011-09-30 5 views
2

두 개 이상의 템플릿 매개 변수를 받아들이는 연관 컨테이너를 매개 변수로 받아 들일 수있는 함수를 작성하는 방법을 알고 싶습니다. 예를 들어, std :: map에서 작동하는 함수를 작성하려면 아래에 표시된 것과 같은 것을 쓸 수 있습니다.함수 컨테이너 템플릿으로서의 연관 컨테이너 매개 변수

template <class Map, class Key, class Value, class Compare, class Allocator> 
void foo(Map<Key, Value, Compare, Allocator>& map); 

boost :: unordered_map은 5 개의 템플릿 매개 변수를 허용하기 때문에 boost :: unordered_map에는 사용할 수 없습니다. 지도를 단일 템플릿 매개 변수로 받아들이고 나중에 키와 값 유형을 추론하기 위해 지원해야하는 특성을 사용할 수 있지만 중첩 된지도의 경우 코드가 매우 상세하고 유지 관리가 어려워집니다. 그러한 함수를 작성하는 더 쉬운 방법이 있겠지만 여전히 2보다 크거나 같은 템플릿 매개 변수의 수를 허용하는 연관 컨테이너에 대해 작동합니까?

iterator가 제공 할 수있는 것보다 iterator가 작동하는 컨테이너에 대한 자세한 정보가 필요하기 때문에 매개 변수로 컨테이너 대신 iterator를 허용하는 것으로 충분하지 않습니다.

대단히 감사합니다!

답변

2

단지 하나의 템플릿 매개 변수와 함께 간단한 방법을 사용하지 이유 : 당신은 당신이 그 구성원 유형이 존재하는 추가 검사를 원하는 일부 멤버 형 검사 typetraits을 추가 할 수 있습니다

template <typename C> void foo(const C & container) 
{ 
    typedef typename C::key_type key_type; 
    typedef typename C::mapped_type mapped_type; 

    // etc. 
} 

,하지만 포기하지 않을 수 있습니다 추가 혜택.

는 다른 방법으로, 당신은 몇 가지 일반적인 패턴 매칭을 할 수 있지만 클래스 만이 아닌 기능 :

template <typename> struct AtLeastTwo; 

template <typename K, typename V, typename ...Args> 
struct AtLeastTo<K, V, Args...> 
{ 
    // now have types K and V 
}; 

typedef std::unordered_map<int, Foo, MyHash> map_type; 
AtLeastTwo<map_type> m; 
// ... 
+0

내부 맵이 외부 맵과 다른 유형 인 경우 특히 코드가 중첩 된 맵에 대해 매우 자세한 정보가됩니다. 올바른 유형을 모두 추출하려면 Boost.TypeTraits를 사용하여 많은 유형 조작이 필요합니다. 값을 인트로 스펙트하기 위해 형질을 사용하지 않고 이것을 할 수있는 더 쉬운 방법이 있는지 알고 싶었습니다. –

+0

중첩 된 맵에 추가되는 복잡성은 무엇입니까? 나는 당신이 성취하려는 것을 확신하지 못한다. 그것을 살펴보면 관련된 유형이 자체지도인지 여부는 중요하지 않습니다. –

+0

그렇습니다. 그러나 const 및 const 또는 포인터인지 참조인지에 관계없이 외부 및 내부 맵의 유형에 반복자가 필요한 경우 사소한 작업을 수행하기 위해 여러 가지 오버로드 된 메서드로 유틸리티 클래스를 만들어야합니다. –

0

가 연관 순서인지에 정보를 전달하지 않는 유형을, 그러한 의미 론적 의미입니다. 표준 인터페이스에 따라 모든 종류의 연관 순서를 지원하지 않으려면 단일 템플릿 매개 변수로 이동하고 특성을 사용하여 키/값 유형 등을 조사하십시오.

+0

그게 제가 현재하고있는 일 이죠. 형질을 사용하여 중첩 된 맵을 지원하는 상용구 코드는 수백 줄의 길이가 있으므로이 작업을 수행하는 더 쉬운 방법이 있는지 알고 싶었습니다. 그러나 두 답을 모두 읽은 후에는 더 쉬운 방법이 없다고 생각합니다. –