Недавно я использовал одну из менее часто используемых функций 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, которые могут потребоваться вам не понаслышке.
Возможно, вы ищете частичное создание шаблона? http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-08/2307.html – 2010-12-04 14:55:31