2016-11-02 3 views
1

Следуя моему предыдущему вопросу, Defining a class member according to the class template, я понял, что количество ячеек по умолчанию для unordered_map слишком мало для моих целей.Использование typedef с параметром конструктора

У меня есть шаблон класса 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.

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

ответ

3

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

+0

Спасибо! Именно то, на что я надеялся! –