我想在我的班级中创建一个常量列表,但是我不知道如何正确地做到这一点。
首先,我尝试这样做,但在这样的枚举中:
class CMyClass{
public:
enum EKeyword
{
E_PARAM1 = "myString1",
E_PARAM2 = "myString2",
...
};
但似乎不可能(->错误C2057:期望的常量表达式)
我知道我可以使用#define或使用“ static const ...”声明逐个声明一个常量,但是我喜欢使用:EKeyword.E_PARAM1来获取我的字符串,但我不喜欢想要全局设置这些常量。
有没有建议?
答案 0 :(得分:2)
在c ++中,不能使用字符串表示形式制作enum
。您将需要一个字符串列表。如果您不想强迫它们在结构(例如enum class
)中被引用,请将它们添加到结构中:
class CMyClass {
public:
struct EKeyword {
static constexpr char const* PARAM_1 = "myString1";
...
private:
EKeyword(); // Disables the ability to construct an EKeyword struct.
};
...
然后在类中的使用将类似于:
EKeyword::PARAM_1
在课堂外将是:
CMyClass::EKeyword::PARAM_1
如果限于c++03
,则需要在cpp文件中创建字符串值:
// .hpp
class CMyClass {
...
struct EKeyword {
static char const* PARAM_1;
...
// .cpp
char const* CMyClass::EKeyword::PARAM_1 = "myString1";
答案 1 :(得分:1)
以下来自提问者的评论:
我正在创建要在文件中查找的关键字列表, 然后用其值交换关键字。例如:找到关键字 “ $ temperature”->用“ 28°C”代替
您建议使用命名变量的方法,否则枚举将不适合使用此方法,因为C ++没有反射,并且无法从代码中访问变量名称。您想要的是一张地图-可能是std::map<std::string, std::string>
,尽管根据使用情况可能需要更高的性能选项-从要查找的值到要替换为它们的值。
执行此操作的最佳方法是读取包含替换值的文件,因为您可以在不修改代码的情况下修改替换值,并拥有更通用的解决方案,但是您可以使用C ++ 11的统一初始化列表以在您的代码中填充地图,或者在统一初始化不适合您的需求或由于某种原因而无法使用C ++ 11的情况下,例如在构造函数中逐一填充。
然后,您可以浏览文件,找到要替换的字符串,然后用列出的替换字符串替换它们。但是要小心,重叠替换将如何处理?您只检查整个单词等吗?