Использование typedef с параметром конструктора

Следуя моему предыдущему вопросу, Определение члена класса в соответствии с шаблоном класса, Я понял, что количество ведра по умолчанию 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 функция.

Единственным ограничением является то, что этот код используется в сотнях мест, которые не должны изменяться (не может полиморфировать мой базовый класс).

1

Решение

поскольку 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-подобная функция работает на существующей карте вместо того, чтобы возвращать новую, основываясь на ваших реальных потребностях прецедента.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]