Estoy un poco confundido acerca de si debería usar typedef en C ++ y cuándo. Siento que es un acto de equilibrio entre legibilidad y claridad.
Aquí hay una muestra de código sin ningún tipo de definición:
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;
...
}
Bastante feo de la OMI. Así que agregaré algunos typedefs dentro de la función para que se vea mejor:
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;
...
}
El código sigue siendo un poco torpe, pero me deshago de la mayoría del material de pesadilla. Pero aún existen los iteradores de vector int, esta variante se deshace de ellos:
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;
...
}
Esto se ve limpio, pero ¿sigue siendo legible?
¿Cuándo debo usar un typedef? ¿Tan pronto como tenga un tipo de pesadilla? ¿Tan pronto como ocurre más de una vez? ¿Dónde debería ponerlos? ¿Debo usarlos en firmas de funciones o mantenerlos en la implementación?
fuente
typedef Input_iterator std::vector<int>::const_iterator;
está al revés#define
no es lo suficientemente bueno.