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