C ++でtypedefを使用すべきかどうか、またいつ使用すべきかについて少し混乱しています。読みやすさと明快さのバランスをとる行為だと思います。
typedefを使用しないコードサンプルを次に示します。
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
static std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>,
int> lookup_table;
std::map<std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator>, int>::iterator lookup_it =
lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
かなりいIMO。そこで、関数内にtypedefをいくつか追加して、見栄えを良くします。
int sum(std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last)
{
typedef std::tuple<std::vector<int>::const_iterator,
std::vector<int>::const_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
コードはまだ少し不器用ですが、ほとんどの悪夢のような素材を取り除きます。しかし、まだintベクトルイテレータがあり、このバリアントはそれらを取り除きます:
typedef std::vector<int>::const_iterator Input_iterator;
int sum(Input_iterator first, Input_iterator last)
{
typedef std::tuple<Input_iterator, Input_iterator> Lookup_key;
typedef std::map<Lookup_key, int> Lookup_table;
static Lookup_table lookup_table;
Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);
if (lookup_it != lookup_table.end())
return lookup_it->second;
...
}
これはきれいに見えますが、それでも読み取り可能ですか?
いつtypedefを使用すべきですか?悪夢のようなタイプがあるとすぐに?複数回発生するとすぐに?どこに置いたらいいですか?関数のシグネチャで使用するか、実装に保持する必要がありますか?
typedef Input_iterator std::vector<int>::const_iterator;
は後方です
#define
十分ではないとき。