Не уверен, что вы подразумеваете под "накладными расходами". Если это упрощает способ написания кода, используйте его, в противном случае придерживайтесь сокращений.
Если он используется только в ограниченной области, поместите typedef в ту же область. Тогда его не нужно публиковать, документировать или отображать на любых диаграммах UML. Например (и я не утверждаю, что это лучший код из всех когда-либо существовавших):
int totalSize() {
typedef std::map<Key, Value> DeDuplicator;
DeDuplicator everything;
// Run around the universe finding everything. If we encounter a key
// more than once it's only added once.
// now compute the total
int total = 0;
for(DeDuplicator::iterator i = everything.begin(); i <= everything.end(); ++i) {
total += i->second.size(); // yeah, yeah, overflow. Whatever.
}
return total;
}
В сочетании с предложением Ферруччо (если вы используете повышение) цикл становится:
BOOST_FOREACH(DeDuplicator::pair p, everything) {
total += p.second.size();
}
И в сочетании с предложением bk1e (если вы используете C ++ 0x или у вас есть возможности от него), и предполагая, что BOOST_FOREACH взаимодействует с auto так, как я думаю, это должно основываться на том факте, что он обычно может обрабатывать неявные преобразования к совместимым типам:
std::map<Key, Value> everything;
// snipped code to run around...
int total = 0;
BOOST_FOREACH(auto p, everything) {
total += p.second.size();
}
Неплохо.