C++ 当我想要一个字符串表示时,使用这种方法而不是枚举有什么问题?

标签 c++ string enums

关于这个主题有几个问题(例如 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";
}

关于C++ 当我想要一个字符串表示时,使用这种方法而不是枚举有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27276574/

相关文章:

python - 如何优雅地找到 Python 枚举中的下一个和上一个值?

c++ - 在枚举值 : C++ 之间切换

c - 在函数 c 中使用枚举定义全局变量

c++ - 以没有尾随零的科学计数法打印 cpp_dec_float

c++ - 自动扣除失败并显示消息 "inconsistent deduction for auto return type"

c++ - 在迭代期间删除 vector 的唯一元素?

c - 在递归函数中修改二维数组,C

python - 查找子序列(非连续的)

c++ - 单例中未解析的外部符号

python - 如何使用Python的re模块检测字符串中的重复模式