我有一个枚举。
对于这个枚举中的每个值,我需要将一些数据与它相关联(实际上在这种情况下,它是一个整数,但我想更一般地知道,例如2个整数值,或2字符串等)。
用户无法访问这些值。在逆向工程的情况下,嗯,不能做太多,但它应该要求用户做一些实际修改它的努力。所以它不能在配置文件或DB等中。
所以我在考虑:
你有什么想法?
总结一下,我有一个包含VAL1,VAL2 ......的枚举
我希望如下:
VAL1的长度为5,名称为#34; foo" VAL2的长度为8,名称为#34; bar"
我可能完全错过了另一个简单的解决方案
答案 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
替换为第二个模板来使其更加通用。
当想要将enum
与std::string
相关联时,这非常有用,因为您可以添加第二个地图,其中std::string
作为关键字,模板参数作为值。只需翻转原始地图,您就可以将string
转换为enum
,并且可以将enum
转换为string