일부 템플릿 기반 직렬화를 구현하고 있습니다. std::map
에 대한 템플릿 기능을 구현했지만 지금은 std::unordered_map
을 사용하고 있습니다. 차라리 & 전체 기능을 붙여 넣기 만하고 매개 변수 유형을 변경하십시오. 지도 또는 정렬되지 않은지도 만 사용하는 템플릿을 만들 수있는 방법이 있습니까?지도 또는 unordered_map을 사용하는 함수를 만들려면 어떻게해야합니까?
답변
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);
}
그러나 이것은 Paul Evans가 대답 한 것이 아닙니다. – Amadeus
@ TomásBadan 그렇습니다.하지만 완전히 기능적인 예가 있습니다. 더 완전한 대답입니다. – linguamachina
한 가지 문제 :'generic_foo'에서 키 및 값 유형에 어떻게 액세스 할 수 있습니까? 지도에서'쌍 '을 꺼내야합니다. – Claudiu
#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.");
}
전자 과부하std::unordered_map
을 위해 std::map
다른 하나를 취할 과부하가 아닌 템플릿 기능으로서의 기능. 이 두 함수가 숨겨진 template
을 호출하지만 아무것도 호출하지 않고 호출 할 수 있습니다. 이 작업을 수행하는 한 가지 방법은 익명 사용자에게 namespace
으로 숨기는 것입니다.
@PiotrS. ** ** ** 전체 기능을 복사하여 붙여 넣지 않습니다 *! 이름이 바뀌고 은닉되어 단순히 std :: map을 사용하지 않고 다른 것을 가져 가기 위해 변경된 함수입니다 –
* std :: map *을 사용하는 템플리트되지 않은 함수는 유형이 하드 코딩되었으므로 사용하지 않습니다. OP의 원래 함수는 템플릿입니다. map/unorderd_map 내의 어떤 타입과의 불일치는 일반적인 하나의 오버로드를 해결할 것입니다 –
이것이 올바른 생각이었고, 나는 업 그레 이드했습니다, 그러나 Piotr은 최종 작업 구현에 나를 도왔습니다 – Claudiu
- 1. 다른 프레임에서 함수를 만들려면 어떻게해야합니까?
- 2. Android에서 unordered_map을 사용하는 방법은 무엇입니까?
- 3. 집합에서 개체를 찾는 함수를 만들려면 어떻게해야합니까?
- 4. std :: map 또는 std :: unordered_map을 클래스의 컨테이너로 전환하려면 어떻게해야합니까?
- 5. 지도 함수를 임의의 숫자로 사용하는 방법
- 6. groupby를 사용하는 column_properties를 만들려면 어떻게해야합니까?
- 7. 함수를 만들려면
- 8. 클래스 내의 함수를 False로 만들려면 어떻게해야합니까?
- 9. 개체 JavaScript에 대한 함수를 만들려면 어떻게해야합니까?
- 10. Go에서 슬라이스로 제네릭 함수를 만들려면 어떻게해야합니까?
- 11. 카레 익명 함수를 스칼라로 만들려면 어떻게해야합니까?
- 12. 이 jquery 함수를 간결하게 만들려면 어떻게해야합니까?
- 13. C에서 선택적 인수를 사용하여 함수를 만들려면 어떻게해야합니까?
- 14. jQuery에서 jQuery() 또는 $()를 사용하는 방법과 같은 선택기를 만들려면 어떻게해야합니까?
- 15. 지도 api v3에서 드래그 가능한 사각형을 만들려면 어떻게해야합니까
- 16. 지도 함수를 인라이닝 (Functor)
- 17. jQuery를보다 구체적으로 만들려면 어떻게해야합니까?
- 18. "var"를 전역 또는 영구으로 만들려면 어떻게해야합니까?
- 19. 안드로이드 플랫폼에서 쿠키 또는 세션을 만들려면 어떻게해야합니까?
- 20. mysql에서 작업 또는 이벤트를 만들려면 어떻게해야합니까?
- 21. 매끄러운 객체 또는 애니메이터 애니메이션을 만들려면 어떻게해야합니까?
- 22. 함수를 호출하고 설정 파일 내에서 사용할 반환 객체를 만들려면 어떻게해야합니까?
- 23. 반원들에게 스위치를 만들려면 어떻게해야합니까?
- 24. jQuery의 trigger() 함수에 대한 콜백 함수를 만들려면 어떻게해야합니까?
- 25. 속성에 맞춰 함수를 기반으로 레일 경로를 만들려면 어떻게해야합니까?
- 26. 새 HttpContext를 만들려면 어떻게해야합니까?
- 27. SpiffWorkflow로 작업을 만들려면 어떻게해야합니까?
- 28. 백그라운드에서 비동기 루프를 만들려면 어떻게해야합니까?
- 29. jQuery의 .each() 함수가 완료된 후에 함수를 true로 만들려면 어떻게해야합니까?
- 30. 이미지 테두리를 만들려면 어떻게해야합니까?
왜 이러한 제한? 'std :: map'과 같은 인터페이스를 가진 맵을 자신의 구현으로 사용하고 싶다면 어떻게해야할까요? – Brian
@Brian : 괜찮을 거예요. 그러나 모든 매개 변수를 취하는 serialize 함수를 정의하는 직렬화 프레임 워크로 제한됩니다. 특히 ints를 취하는 다른'serialize' 함수와 충돌하지 않을까요? – Claudiu