最优雅的方式来硬编码对,三元组...值

时间:2015-06-04 10:49:43

标签: c++

我有一个枚举。

对于这个枚举中的每个值,我需要将一些数据与它相关联(实际上在这种情况下,它是一个整数,但我想更一般地知道,例如2个整数值,或2字符串等)。

用户无法访问这些值。在逆向工程的情况下,嗯,不能做太多,但它应该要求用户做一些实际修改它的努力。所以它不能在配置文件或DB等中。

所以我在考虑:

  1. 硬编码,但在这种情况下,最优雅(最不可怕)的方法是什么?只需在命名空间中硬编码一对,三元组,然后将其存储在哈希[enumValue] - > [struct]?
  2. 将其存储在一个将被编译为资源文件的文件中(尽管可以通过某些工具访问它,但它会要求用户付出更多努力)。我甚至可以做一个校验和,以确保在必要时我没有修改它?
  3. 你有什么想法?

    总结一下,我有一个包含VAL1,VAL2 ......的枚举

    我希望如下:

    VAL1的长度为5,名称为#34; foo" VAL2的长度为8,名称为#34; bar"

    我可能完全错过了另一个简单的解决方案

1 个答案:

答案 0 :(得分:2)

此代码改编自我刚才在另一个stackoverflow帖子上发现的解决方案 - 如果有人可以再次找到原始链接,我会将其包含在内以表示对它们的信任。

我有一个类似的问题,我希望将string与每个枚举值相关联。稍微调整一下代码的情况我会得到这个。

template<typename T> class EnumParser
{
    private:
        std::map<T, std::pair<int, std::string>> _map_enum_keyed;   // Map with enum values as keys

    public:
        EnumParser();   // Unspecified constructor
        T Enum(const std::string &key) const;   // Get the enum value for the given string key
        std::pair<int, std::string> Value(const T &key) const;  // Get the string value of the given enum key
};

// Template definitions

template<typename T>
std::pair<int, std::string> EnumParser<T>::Value(const T &key) const
{
    const auto &iterator = this->_map_enum_keyed.find(key);
    if(iterator == this->_map_enum_keyed.end())
    {
        throw std::runtime_error("EnumParser::Value(const T &key) - error 1 - Could not find key");
    }
    return iterator->second;
}

然后,您可以在声明enum标头 cpp 文件中使用此文件,方法是指定使用该enum初始化的EnumParser的构造函数{1}}

template<>EnumParser<YOUR_ENUM>::EnumParser()
{
    this->_map_enum_keyed = {
        {YOUR_ENUM::Value1, std::make_pair(5, "foo")},
        {YOUR_ENUM::Value2, std::make_pair(8, "bar")},
    };
}

您可以通过添加第二个模板参数并将std::pair替换为第二个模板来使其更加通用。

当想要将enumstd::string相关联时,这非常有用,因为您可以添加第二个地图,其中std::string作为关键字,模板参数作为值。只需翻转原始地图,您就可以将string转换为enum,并且可以将enum转换为string