有关此主题有几个问题(例如herehere)。我对所提出的解决方案如此宽松感到惊讶。另外,我有点懒,我想避免为枚举保留额外的字符串列表。
我提出了以下建议,我想知道我的方法是否存在根本上的错误...

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";
}

10-08 13:46
查看更多