Sono un po 'confuso su se e quando dovrei usare typedef in C ++. Sento che è un atto di equilibrio tra leggibilità e chiarezza.
Ecco un esempio di codice senza errori typedefs:
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 piuttosto brutto. Quindi aggiungerò alcuni typedef all'interno della funzione per renderlo più bello:
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;
...
}
Il codice è ancora un po 'goffo, ma mi libero del materiale da incubo. Ma ci sono ancora gli iteratori vettoriali int, questa variante si sbarazza di quelli:
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;
...
}
Sembra pulito, ma è ancora leggibile?
Quando dovrei usare un typedef? Non appena ho un tipo da incubo? Non appena si verifica più di una volta? Dove dovrei metterli? Dovrei usarli nelle firme delle funzioni o tenerle all'implementazione?