2010-12-04 3 views
8

Недавно я использовал одну из менее часто используемых функций STL - пользовательские распределители, и мне нужна серьезная помощь в сокращении моих семантических накладных расходов. Возьмем, к примеру, определение неупорядоченной карты, которая отображает имена файлов на неупорядоченную карту пары int и shared_ptr на токен, но использует пользовательский распределитель.Уменьшение сложности шаблона в C++

typedef std::pair<int, int> token_key_type; 
typedef std::unordered_map< 
    token_key_type, 
    std::shared_ptr<Token>, 
    std::hash<token_key_type>, 
    std::equal_to<token_key_type>, 
    Allocator< 
     std::pair< 
      const token_key_type, 
      std::shared_ptr< 
       Token 
      > 
     > 
    > 
> filename_map_value_type; 
std::unordered_map< 
    string, 
    filename_map_value_type, 
    std::hash<string>, 
    std::equal_to<string>, 
    Allocator< 
     std::pair< 
      const string, 
      filename_map_value_type 
     > 
    > 
> tokens; 

Это 404 символа определений. И затем, чтобы построить его, я должен передать значение по умолчанию для каждого аргумента шаблона, за исключением Allocator, который не может быть сконфигурирован по умолчанию, и подсчет ведра, для которого не существует никакого определения, в результате чего еще 168 символов просто построили черт побери. Плюс, конечно, то же самое снова каждый раз, когда я хочу вставить, потому что тип значения первой карты также должен быть построен так же.

Есть ли способ избежать этого, без необходимости писать собственный unordered_map? Это серьезно начинает замедлять мою производительность.

Редактировать: Sorry! Я имел в виду, в общем, для контейнеров STL, а не только для unordered_map, это всего лишь худший случай. У меня также есть эта проблема с обычной картой, unordered_set и т. Д., И я не могу написать какую-либо функцию для выполнения всего этого для всех возможных контейнеров STL, которые могут потребоваться вам не понаслышке.

+0

Возможно, вы ищете частичное создание шаблона? http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-08/2307.html – 2010-12-04 14:55:31

ответ

6

решение icecrime также может быть сделано только с чуть более уродства на старых компиляторов с помощью кода ниже , Вы также можете добавить заводские функции для упрощения конструкции.

template<typename K, typename V> struct unordered_map_type 
{ 
    typedef std::unordered_map< 
     K, 
     V, 
     std::hash<K>, 
     std::equal_to<K>, 
     Allocator< 
      std::pair<const K, V> 
     > 
    > type; 
}; 

typedef std::pair<int, int> token_key_type; 
typedef unordered_map_type<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type; 
6

К сожалению, я не могу предоставить полный и компилируемый код, потому что у меня нет компилятора C++ 0x. Тем не менее, я считаю, C++ 0x template aliases может быть полезным здесь:

template<class Key, class Value> 
using custom_unordered_map = std::unordered_map 
    < 
     Key, 
     Value, 
     std::hash<Key>, 
     std::equal_to<Value>, 
     Allocator<std::pair<const Key, Value>> 
    >; 

typedef custom_unordered_map<token_key_type, std::shared_ptr<Token>> filename_map_value_type; 
typedef custom_unordered_map<std::string, filename_map_value_type> your_typedef_name; 

Еще раз извините, если это не компилируется.

Также отметим, что это уже возможно в C++ 03 с помощью дополнительного типа «разыменования»:

template<class Key, class Value> 
struct custom_unordered_map 
{ 
    typedef std::unordered_map 
    < 
     Key, 
     Value, 
     std::hash<Key>, 
     std::equal_to<Value>, 
     Allocator<std::pair<const Key, Value> > 
    > type; 
}; 

typedef custom_unordered_map<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type; 
typedef custom_unordered_map<std::string, filename_map_value_type>::type your_typedef_name; 
+0

Мне нравится этот, если доступен C++ 0x. – diverscuba23 2010-12-04 14:55:49

+0

«шаблонный псевдоним» - это функция, которую я жду больше всего, я часто смотрю на gcc-сайт, надеясь, что он будет реализован. Есть ли компилятор, который уже реализует эту функцию? – rafak 2010-12-06 20:26:23

Смежные вопросы