c++ - 枚举类在 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# - 如何反序列化具有不同类型属性的 XML 数组
- javascript - 加载新类别后 Javacsript 无法正常工作
- python - 我们如何使用 fastAPI 构建一个 API 来触发另一个 Python 文件执行查询,而不等待它的响应?
- sql-server - ETL 的变更捕获替代方案
- php - 正则表达式中只需要一个数字
- mongodb - Golang FieldPath 字段名称中的 Mongo 错误可能不包含“.”。考虑使用 $getField 或 $setField
- 7zip - 7zip cli 参数仅移动文件
- java - 操作数堆栈上的错误类型:切换条件的通用字符串返回类型
- java - 我需要有关 android 中微调器的帮助。我想根据微调器中的下拉选项更改文本视图和编辑文本的文本大小
- html - 如何仅使用 CSS 根据 html 标签的内容应用 css?