Tôi hơi bối rối về việc khi nào và khi nào tôi nên sử dụng typedef trong C ++. Tôi cảm thấy đó là một hành động cân bằng giữa dễ đọc và rõ ràng.
Đây là một mẫu mã mà không có bất kỳ typedefs nào:
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 khá xấu xí. Vì vậy, tôi sẽ thêm một số typedefs trong hàm để làm cho nó trông đẹp hơn:
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;
...
}
Mã vẫn còn một chút vụng về, nhưng tôi thoát khỏi hầu hết các tài liệu ác mộng. Nhưng vẫn còn các trình lặp vector int, biến thể này loại bỏ những thứ đó:
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;
...
}
Điều này có vẻ sạch sẽ, nhưng nó vẫn có thể đọc được?
Khi nào tôi nên sử dụng typedef? Ngay khi tôi có một loại ác mộng? Ngay khi nó xảy ra nhiều hơn một lần? Tôi nên đặt chúng ở đâu? Tôi nên sử dụng chúng trong chữ ký chức năng hoặc giữ chúng để thực hiện?
typedef Input_iterator std::vector<int>::const_iterator;
là ngược
#define
không đủ tốt.