我正在使用 C++11。我不允许使用像 boost 等外部库。我只能使用 STL。

我有很多事件,必须将其标识为字符串常量。我不允许使用枚举或整数或任何其他数据类型。例如:



然后,我有一些需要使用这些字符串的类,但不知道其他类是否存在(它们之间没有任何关系)。

class Panel{

    void postEvent(){
        SomeSingleton::postEvent("event_name");
    }
}

另一个类::
class SomeClass{

    SomeClass(){
        SomeSingleton::listenForEvent("event_name");
    }

    void receiveEvent(){
         //This function is triggered when "event_name" occurs.
         //Do stuff
    }
}

所有这些事件都是常量,用于识别正在发生的事情。

这是我尝试过的:

How to store string constants that will be accessed by a number of different classes?

那里的一些人建议我提供如何解决具体问题的具体细节,所以我创建了这个新问题。

如何将字符串存储在一个公共(public)文件中,以便使用这些字符串的所有其他类都可以引用同一个文件?
  • 我不想在我的应用程序的生命周期内浪费内存或泄漏内存(它是一个移动应用程序)
  • 编译时间对我来说没什么大不了的,因为项目不是那么大
  • 预计可能会有 50 个不同的事件。
  • 似乎将所有字符串保存在一个文件中更易于维护,并在情况发生变化时仅编辑该文件。
  • 任何类都可以在任何时间监听任何事件,编译之前我不会知道
  • 最佳答案

    最简单的方法是使用 char const* 常量,因为它更易于优化并且不使用动态分配。

    您也可以在 std::string_view 函数中使用 postEvent,避免动态分配。此步骤是可选的。如果您无法拥有字符串 View 但仍想避免动态分配,请引用您的实现的 SSO 最大容量并将事件名称保持在该大小以下。

    还要考虑 nonstd::string_view 可以作为 C++11 库提供,并且很可能是您需要的抽象。诸如 cpp17_headers string-view-lite 之类的库仅用于此目的。

    它看起来像这样:

    constexpr auto event_name1 = "event_name1";
    

    在作为静态成员的类中,它的工作方式相同:
    struct Type {
        static constexpr auto event_name1 = "event_name1";
    };
    

    这最多会占用可执行文件的只读静态数据中的空间。

    关于c++ - 如何在运行时以最小的开销共享全局常量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55498738/

    10-17 00:29