使用60K +条目初始化类静态映射

时间:2018-04-23 19:00:02

标签: c++ c++11 static

我有一个这样的课程:

class AntennaController
{
    public:
        static map<uint16_t, uint64_t> channel_to_freq;
        static map<uint64_t, uint16_t> freq_to_channel;
};

这两个地图将发射频率转换为频道,反之亦然(即140000000 -> 44 -> 140000000)。共有65536个不同的频道。

所以我的问题是:有没有办法初始化这些静态成员而无需为每个地图手动列出所有65536个键值对(即使用for循环)?

如果我不使用静态地图以便我可以在构造函数中初始化它,那么每个实例都不会有自己的副本吗?

1 个答案:

答案 0 :(得分:1)

有几种选择。您可以为类编写静态函数,使用for循环构建映射并返回映射。然后,您可以使用该函数初始化类成员,如

// header file
class AntennaController
{
    public:
        static map<uint16_t, uint64_t> channel_to_freq;
        static map<uint64_t, uint16_t> freq_to_channel;
        map<uint64_t, uint16_t> build_channel_to_freq { /* code here */ }
        map<uint64_t, uint16_t> build_freq_to_channel { /* code here */ }
};

//cpp file
AntennaController::map<uint16_t, uint64_t> channel_to_freq = build_channel_to_freq();
AntennaController::map<uint64_t, uint16_t> freq_to_channel = build_freq_to_channel();

您还可以编写一个脚本/程序来为您构建一个初始化列表,然后您可以将该文件包含在您的代码库中。您可以生成列表,然后执行类似

的操作
AntennaController::map<uint16_t, uint64_t> channel_to_freq { #include "channel_to_freq_list.h" }
AntennaController::map<uint16_t, uint64_t> freq_to_channel { #include "freq_to_channel_list.h" }

或者您可以让它构建整个事物并让它输出一个可以添加到项目中的cpp文件。