Я трохи розгублений щодо того, якщо і коли мені слід використовувати typedef в C ++. Я відчуваю, що це балансуючий акт між читабельністю та ясністю.
Ось зразок коду без будь-яких типів:
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;
...
}
Досить потворний ІМО. Тож я додаю кілька типів у функції, щоб вона виглядала приємніше:
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
не досить добре