关于这个主题有几个问题(例如 here 和 here)。我对提议的解决方案如此冗长感到有点惊讶。另外,我有点懒,不想为我的枚举维护额外的字符串列表。 我想出了以下内容,我想知道我的方法是否存在根本性错误......
class WEEKDAY : public std::string{
public:
static const WEEKDAY MONDAY() {return WEEKDAY("MONDAY");}
static const WEEKDAY TUESDAY(){return WEEKDAY("TUESDAY");}
/* ... and so on ... */
private:
WEEKDAY(std::string s):std::string(s){};
};
我仍然必须多次键入名称/字符串表示形式,但至少现在每个可能的值都在一行中,而且总的来说,它不需要比普通枚举多多少行。使用这些 WEEKDAYS 看起来几乎与使用枚举相同:
bool isAWorkingDay(WEEKDAY w){
if (w == WEEKDAY::MONDAY()){return true;}
/* ... */
return false;
}
它直接获得“字符串表示”(好吧,实际上它只是一个字符串)
std::cout << WEEKDAY::MONDAY() << std::end;
我对 C++ 还是比较陌生(不是在写作方面,而是在理解方面;),所以也许有些事情可以用枚举来完成,而这些事情不能用这种常量来完成。
最佳答案
您可以使用预处理器来避免重复名称:
#define WEEKDAY_FACTORY(DAY) \
static const WEEKDAY DAY() {return WEEKDAY(#DAY);}
WEEKDAY_FACTORY(MONDAY)
WEEKDAY_FACTORY(TUESDAY)
// and so on
重复数据删除是否值得混淆是一个品味问题。在大多数地方使用枚举比使用包含字符串的类更有效;我可能会这样做,并且只在需要时转换为字符串。您可以使用预处理器以类似的方式提供帮助:
char const * to_string(WEEKDAY w) {
switch (w) {
#define CASE(DAY) case DAY: return #DAY;
CASE(MONDAY)
CASE(TUESDAY)
// and so on
}
return "UNKNOWN";
}
关于C++ 当我想要一个字符串表示时,使用这种方法而不是枚举有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27276574/