Thông thường, người ta cần nhiều kiểu liệt kê cùng nhau. Đôi khi, người ta có một cuộc đụng độ tên tuổi. Có hai giải pháp cho vấn đề này: sử dụng không gian tên hoặc sử dụng tên phần tử enum 'lớn hơn'. Tuy nhiên, giải pháp không gian tên có hai cách triển khai khả thi: một lớp giả với các enum lồng nhau hoặc một không gian tên hoàn chỉnh.
Tôi đang tìm kiếm ưu và nhược điểm của cả ba cách tiếp cận.
Thí dụ:
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
enum e {...}
, enum có thể ẩn danh, tức là enum {...}
, điều này có ý nghĩa hơn nhiều khi được bao bọc trong không gian tên hoặc lớp.