枚举类不接受C++中带有连字符/短划线的文本



我正在创建一个enum class,但Eclipse中的CDT编译器抛出错误,因为我的常量列表中有连字符。我无法避免使用连字符/破折号,因为它是产品代码的一部分。有变通办法吗?

enum class ProductCode{
JELLY-BEANS,
SALE,
TWISTED-TWIRLS,
5-STARS
}

连字符(-(不能是C++语言中标识符的一部分。

标识符是由数字、下划线、小写和大写拉丁字母以及大多数Unicode字符组成的任意长序列。它必须以下划线或字母开头。另请参阅cppreference/Identifiers。

通常,下划线(_(字符用于宏和枚举常量等标识符:

enum class ProductCode {
JELLY_BEANS,
SALE,
TWISTED_TWIRLS,
FIVE_STARS // this also can't start with '5'
}

枚举常量不存储文本,因此它们不需要像产品代码那样完全格式化。要从枚举常量转换为产品代码,可以执行以下操作:

#include <map>
constexpr const char* textOf(ProductCode code) {
switch (code) {
case ProductCode::JELLY_BEANS: return "JELLY-BEANS";
case ProductCode::SALE: return "SALE";
case ProductCode::TWISTED_TWIRLS: return "TWISTED-TWIRLS";
case ProductCode::FIVE_STARS: return "5-STARS";
}
}
ProductCode codeOf(const std::string &str) {
static const std::map<std::string, ProductCode> map{
{textOf(ProductCode::JELLY_BEANS), ProductCode::JELLY_BEANS},
{textOf(ProductCode::SALE), ProductCode::SALE},
{textOf(ProductCode::TWISTED_TWIRLS), ProductCode::TWISTED_TWIRLS},
{textOf(ProductCode::FIVE_STARS), ProductCode::FIVE_STARS}
};
return map.at(str);
}

我无法避免连字符/破折号,因为它是产品代码的一部分,是否有解决方案。

您不能在C++中的任何变量或常量名称中使用连字符-

除了可以使用下划线"_"之外,没有其他解决方法。

如[1,2]所述,这不能用枚举完成,因为常量需要是有效的C++标识符,而连字符或以数字开头会使其无效。

然而,作为";"变通方法";,您可以使用C++映射,如下所示:

#include <iostream>
#include <map>
std::map < std::string, int >
ProductCode = {
{"JELLY-BEANS", 0},
{"SALE", 1},
{"TWISTED-TWIRLS", 2},
{"5-STARS", 3}
};
int main ()
{
std::cout << "ProductCode["TWISTED-TWIRLS"] is " << ProductCode["TWISTED-TWIRLS"];
return 0;
}

可在此处测试:https://onlinegdb.com/SJ3K9B5mw

最新更新