【问题标题】:Declare a "list" of constant in a class在类中声明一个常量“列表”
【发布时间】:2019-06-02 23:46:25
【问题描述】:

我想在我的班级中创建一个常量列表,但我不知道如何正确地做到这一点。

首先我尝试将它放在这样的枚举中:

class CMyClass{

public:
enum EKeyword
{
  E_PARAM1 = "myString1",
  E_PARAM2 = "myString2",
  ...
};

但似乎不可能(->错误C2057:预期的常量表达式)

我知道我可以用#define 或使用“static const ...”声明一个一个地声明我的每个常量,但我喜欢使用:EKeyword.E_PARAM1 来获取我的字符串,但我不这样做想要将这些常量设置为全局。

有什么建议吗?

【问题讨论】:

  • 这个的用例是什么?
  • 我正在创建一个我将在文件中查找的关键字列表,然后将关键字与其值交换。例如:查找关键字“$temperature” -> 将单词替换为“28°C”
  • “我不使用 c++11” - 你知道,如果知道这些限制在事实发生之前会很好。

标签: c++ class constants c++03


【解决方案1】:

您不能在 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";

Here is a live example.

【讨论】:

  • 更好。我喜欢范围界定的想法。 +1
  • @StoryTeller 是的,很好。我们也将它用于枚举,因为我们仍然停留在 c++03 领域。
  • 为什么要使用 constexpr 而不是 const ?
  • @Thieuma 如果你不想在其他constexpr 函数或定义中使用这个定义,那么你需要它。
  • 我必须阅读更多关于 constexpr 的内容才能理解,但它似乎只在 c++11 之后才可用。我没有工作。
【解决方案2】:

根据提问者的评论:

我正在创建一个我将在文件中查找的关键字列表,并且 然后将关键字与其值交换。例如:找到关键字 "$temperature" -> 将单词替换为 "28°C"

您建议使用命名变量的方法,否则枚举将不适合此方法,因为 C++ 没有反射并且无法从代码中访问变量名称。您需要的是一张地图 - 可能是 std::map<std::string, std::string>,尽管根据用例可能需要更高性能的选项 - 从您想要查找的值到您想要替换它们的值。

最好的方法是读入一个包含替换值的文件,因为这样你就可以在不修改代码的情况下修改替换值,并且有一个更通用的解决方案,但是你可以使用 C++11 的统一初始化列表以在您的代码中填充地图,或者如果统一初始化不适合您的需要或由于某种原因 C++11 对您不可用,则可能在构造函数中一一填充它们。

然后,您可以扫描文件查找要替换的字符串并用列出的替换替换它们。不过要小心,您将如何处理重叠替换?你只检查整个单词等吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2010-10-30
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多