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
충분하지 않을 때 .