「オーバーヘッド」の意味がわかりません。コードの記述方法が簡単になる場合はそれを使用し、それ以外の場合は手書きを使用します。
制限されたスコープでのみ使用する場合は、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;
}
Ferruccio の提案 (ブーストを使用している場合) と組み合わせると、ループは次のようになります。
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();
}
悪くない。