ฉันสับสนเล็กน้อยเกี่ยวกับว่าและเมื่อไรฉันควรใช้ 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;
...
}
IMO ที่น่าเกลียดทีเดียว ดังนั้นฉันจะเพิ่ม typedefs ภายในฟังก์ชันเพื่อให้ดูดีขึ้น:
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
ไม่ดีพอ