2014-09-09 1 views
3

일부 템플릿 기반 직렬화를 구현하고 있습니다. std::map에 대한 템플릿 기능을 구현했지만 지금은 std::unordered_map을 사용하고 있습니다. 차라리 & 전체 기능을 붙여 넣기 만하고 매개 변수 유형을 변경하십시오. 지도 또는 정렬되지 않은지도 만 사용하는 템플릿을 만들 수있는 방법이 있습니까?지도 또는 unordered_map을 사용하는 함수를 만들려면 어떻게해야합니까?

+0

왜 이러한 제한? 'std :: map'과 같은 인터페이스를 가진 맵을 자신의 구현으로 사용하고 싶다면 어떻게해야할까요? – Brian

+0

@Brian : 괜찮을 거예요. 그러나 모든 매개 변수를 취하는 serialize 함수를 정의하는 직렬화 프레임 워크로 제한됩니다. 특히 ints를 취하는 다른'serialize' 함수와 충돌하지 않을까요? – Claudiu

답변

4
template <typename MAP> 
void generic_foo(MAP& map) 
{ 
    // generic implementation of your function 
    // that works with unordered_map and map 

    using K = typename MAP::key_type; 
    using T = typename MAP::mapped_type; 
} 

// matches any possible implementation of std::unorderd_map 
template <class Key,          
      class T,         
      class Hash,      
      class Pred,     
      class Alloc> 
void foo(std::unordered_map<Key, T, Hash, Pred, Alloc>& m) 
{ 
    // signature matched! forward to your implementation 
    generic_foo(m); 
} 

// matches any possible implementation of std::map   
template <class Key,          
      class T,       
      class Compare,     
      class Alloc> 
void foo(std::map<Key, T, Compare, Alloc>& m) 
{ 
    // signature matched! forward to your implementation 
    generic_foo(m); 
} 

LIVE DEMO

+0

그러나 이것은 Paul Evans가 대답 한 것이 아닙니다. – Amadeus

+0

@ TomásBadan 그렇습니다.하지만 완전히 기능적인 예가 있습니다. 더 완전한 대답입니다. – linguamachina

+0

한 가지 문제 :'generic_foo'에서 키 및 값 유형에 어떻게 액세스 할 수 있습니까? 지도에서'쌍 '을 꺼내야합니다. – Claudiu

0
#include<type_traits> 
template<typename T> 
void foo(T t){ 
    static_assert(std::is_same<T, std::map</*some_type*/>::value 
       || std::is_same<T, std::unordered_map</*some_type*/>::value, 
        "Foo can only get std::map or std::unordered_map."); 
} 
2

전자 과부하std::unordered_map을 위해 std::map 다른 하나를 취할 과부하가 아닌 템플릿 기능으로서의 기능. 이 두 함수가 숨겨진 template을 호출하지만 아무것도 호출하지 않고 호출 할 수 있습니다. 이 작업을 수행하는 한 가지 방법은 익명 사용자에게 namespace으로 숨기는 것입니다.

+3

@PiotrS. ** ** ** 전체 기능을 복사하여 붙여 넣지 않습니다 *! 이름이 바뀌고 은닉되어 단순히 std :: map을 사용하지 않고 다른 것을 가져 가기 위해 변경된 함수입니다 –

+0

* std :: map *을 사용하는 템플리트되지 않은 함수는 유형이 하드 코딩되었으므로 사용하지 않습니다. OP의 원래 함수는 템플릿입니다. map/unorderd_map 내의 어떤 타입과의 불일치는 일반적인 하나의 오버로드를 해결할 것입니다 –

+0

이것이 올바른 생각이었고, 나는 업 그레 이드했습니다, 그러나 Piotr은 최종 작업 구현에 나를 도왔습니다 – Claudiu

관련 문제