Следуя моему предыдущему вопросу, Определение члена класса в соответствии с шаблоном класса, Я понял, что количество ведра по умолчанию 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;
};
Я хотел бы изменить размер по умолчанию Map
в случае, если это последний тип, используя его consturctor (первый параметр определяет размер) или используя неупорядоченную карту rehash
функция.
Моя единственная идея пока состоит в том, чтобы использовать Base
конструктор класса для проверки (dynamic_cast
?) будь моим mMap
карта или неупорядоченная карта с последующим использованием rehash
функция.
Единственным ограничением является то, что этот код используется в сотнях мест, которые не должны изменяться (не может полиморфировать мой базовый класс).
поскольку MapType
это уже класс черты для абстрагирования немного аспект Map
(его тип), вы можете расширить его, чтобы абстрагировать другой аспект (конструкцию):
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
-подобная функция работает на существующей карте вместо того, чтобы возвращать новую, основываясь на ваших реальных потребностях прецедента.
Других решений пока нет …