C++ 最优雅的硬码对、三元组。。。价值观

C++ 最优雅的硬码对、三元组。。。价值观,c++,C++,我有一个枚举 对于这个枚举中的每个值,我需要与它关联一些数据(实际上,在本例中,它是一个整数,但我想知道更一般的情况,例如2个整数值,或2个字符串等) 用户无法访问这些值。在逆向工程的情况下,虽然做不了多少,但它应该要求用户做出一些努力来实际修改它。所以它不能在配置文件或数据库中 所以我在想: 但是在这种情况下,最优雅(最不可怕)的方法是什么?只是在名称空间中硬编码一对三元组,然后将其存储在哈希[enumValue]->[struct]中 将其存储在一个将被编译为资源文件的文件中(虽然这可以通过

我有一个枚举

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

用户无法访问这些值。在逆向工程的情况下,虽然做不了多少,但它应该要求用户做出一些努力来实际修改它。所以它不能在配置文件或数据库中

所以我在想:

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

    总而言之,我有一个包含VAL1、VAL2

    我想说:

    VAL1的长度为5,名称为“foo” VAL2的长度为8,名称为“bar”


    我可能完全错过了另一个简单的解决方案,不过这段代码是根据我不久前在另一篇stackoverflow文章中找到的解决方案改编而成的-如果有人能再次找到原始链接,我会将其包括在内,以表扬他们

    我遇到了一个类似的问题,我想将
    字符串
    与每个枚举值关联起来。根据一对值的情况稍微修改代码,我得到这个

    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;
    }
    
    通过添加第二个模板参数并用第二个模板替换我使用的
    std::pair
    ,您可以使这一点更加通用

    当想要将
    enum
    std::string
    关联时,这尤其有用,因为您可以在第二个映射中添加
    std::string
    作为键,模板参数作为值。通过简单地反转原始映射,您可以将
    字符串
    转换为
    枚举
    ,也可以将
    枚举
    转换为
    字符串

    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")},
        };
    }