将typedef与构造函数参数一起使用

时间:2016-11-02 08:44:53

标签: c++ typedef metaclass

根据我之前的问题Defining a class member according to the class template,我发现unordered_map的默认存储桶数量太低,不适合我的目的。

我有一个类模板Base,它将使用地图或无序地图,具体取决于模板参数:

template<class A, class B> 
class Base {
    template<class T1, class T2>
    struct MapType { typedef boost:unordered_map<...> MType; };
    template<class T2>
    struct MapType<std::string, T2> { typedef std::map<...> MType; };

    typedef typename MapType<...>::MType Map;

    Map mMap;
};

我希望通过使用其consturctor(第一个参数定义大小)或使用无序映射Map函数来更改rehash的默认大小,以防它是后一种类型。

到目前为止,我唯一的想法是使用Base类构造函数来检查(dynamic_cast?)我的mMap是地图还是无序地图,然后使用{ {1}}功能。

唯一的限制是这个代码被用在数百个不能改变的地方(不能改变我的基类)。

1 个答案:

答案 0 :(得分:3)

由于MapType已经是一个用于抽象 Map(其类型)方面的特征类,因此您可以将其扩展为抽象另一个方面(构造):< / p>

template<class A, class B> 
class Base {
    template<class T1, class T2>
    struct MapType {
      typedef boost:unordered_map<...> MType;
      static MType create() { return MType(BUCKET_SIZE); }
    };

    template<class T2>
    struct MapType<std::string, T2> {
      typedef std::map<...> MType;
      static MType create() { return MType(); }
    };

    typedef typename MapType<...>::MType Map;

    Map mMap;

    Base() : mMap(MapType<...>::create()) {}
}

当然,您可以将一些参数传递到create(并在一个或另一个案例中忽略其中的一些/全部),或让create - 类函数在现有地图上运行而不是根据您的实际用例需求返回一个新的。