我如何使用SFINAE来区分MyMap,std :: map和std :: unordered_map?

问题描述 投票:0回答:1

我想制作一个可以使用任何地图实现的结构。我们称它为MapHolder。当前,它看起来像这样:

template<template<class, class, class...> class MapType>
struct MapHolder
{
  MapType<int, int> m_map;
}

这将适用于任何地图。

但我也想尽可能使用自定义比较器/分配器/哈希:

 // Works only with std::unordered_map
 MapType<int, int, my::hash<int>> m_map;

 // Works only with std::map
 MapType<int, int, std::greater<>> m_map;

而且它将仅使用其中一个类进行编译。

SFINAE不能帮助我让编译器选择最合适的声明(即,第一个用于MapHolder<MyMap>,第二个用于MapHolder<std::unordered_map>,依此类推)?

c++ compilation stl metaprogramming sfinae
1个回答
1
投票

我将在这里使用部分模板专业化。如:

template<template<class, class, class...> class MapType>
struct MapHolder
{
private:
   template <typename> struct ThirdArgument;

   template <typename K,  typename V, typename C, typename A>
   struct ThirdArgument<std::map<K, V, C, A>>
   {
      using type = std::greater<K>;
   };

   template <typename K,  typename V, typename H, typename E, typename A>
   struct ThirdArgument<std::unordered_map<K, V, H, E, A>>
   {
      using type = std::hash<K>;
   };

public:
   MapType<int, int,
      typename ThirdArgument<MapType<int, int>>::type
   > m_map;
};

int main()
{
    MapHolder<std::map> m1;
    MapHolder<std::unordered_map> m2;
}

实时演示:https://godbolt.org/z/mEaFZv

© www.soinside.com 2019 - 2024. All rights reserved.