C++,我可以在编译时静态初始化 std::map 吗?

标签 c++ stl embedded

如果我编码这个

std::map<int, char> example = {
                                (1, 'a'),
                                (2, 'b'),
                                (3, 'c') 
                              };

然后g++对我说

deducing from brace-enclosed initializer list requires #include <initializer_list>
in C++98 ‘example’ must be initialized by constructor, not by ‘{...}’   

这让我有点恼火,因为构造函数是运行时的,理论上可能会失败。

当然,如果确实如此,它会很快失败并且应该始终如一地这样做,所以我应该快速定位并纠正问题。

但是,我仍然很好奇 - 是否有在编译时初始化 map 、 vector 等?


编辑:我应该说我正在为嵌入式系统开发。并非所有处理器都有 C++0x 编译器。最受欢迎的可能会,但我不想遇到问题并且必须维护 2 个版本的代码。

至于 Boost,我还没有决定。他们对在嵌入式系统中使用他们的有限状态机类持怀疑态度,所以这实际上是我在这里编码的,事件/状态/Fsm 类。

唉,我想我最好还是谨慎行事,但我希望这次讨论对其他人有所帮助。

最佳答案

这并不完全是静态初始化,但仍然可以尝试一下。 如果你的编译器不支持 C++0x,我会选择 std::map 的迭代构造函数:

std::pair<int, std::string> map_data[] = {
    std::make_pair(1, "a"),
    std::make_pair(2, "b"),
    std::make_pair(3, "c")
};

std::map<int, std::string> my_map(map_data,
    map_data + sizeof map_data / sizeof map_data[0]);

这非常易读,不需要任何额外的库,并且应该适用于所有编译器。

关于C++,我可以在编译时静态初始化 std::map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2172053/

相关文章:

c++ - 无法将元素插入到包含引用的类的 vector 中

c++ - 有序集/ map 的计数功能

c++ - 从函数返回迭代器

在嵌入式编程中 main 启动之前检查 GPIO 的状态

c++ - 具有 STL C++ 错误的强连接组件?

c++ - fopen() 在内部更改我的文件名?

c - 如何将数字转换为Q格式

c - 如何让 Eclipse 识别 __far 修饰符?

c++ - SFINAE enable_if 启用 c++11 之前的构造函数

c++ - 对齐输出中的小数位?