C++ INI 文件读取器的自定义枚举结构
我正在尝试创建一个具有字符串标签和值的枚举,我计划使用它从 ini 文件中读取内容。
例如,在 ini 文件中,我可能有一些 double
、int
或 string
类型值,前面带有值的标签/名称:
SomeFloat = 0.5
SomeInteger = 5
FileName = ../Data/xor.csv
当我从以 string
形式出现的文件中读取标签,因此我希望有 std::set
来保留我的所有值...当我读取标签,我可以将其与 EnumType
进行比较,如果与标签匹配,那么我将检查类型并进行正确的转换(atoi 或仅使用字符串等)
例如:
EnumType<int> someInteger;
someInteger.label = "SomeInteger";
someInteger.type = INT;
std::set<EnumType> myValues;
//
// populate the set
myValues.insert(someInteger);
//
void ProcessTagAndValue(const std::string &tag, const std::string &value)
{
switch(myValues[tag].type)
{
case INT:
myValues[tag].value = atoi(value);
break;
case DOUBLE:
//
break;
case STRING:
myValues[tag].value = value;
break;
default:
break;
}
}
enum ValueType{INT,DOUBLE,STRING];
template <class T>
struct EnumType{
std::string label;
ValueType type;
T value;
bool operator==(const EnumType &other) const {
return this->label == other.label;
}
bool operator==(const T& other ) const
{
return this->value == other;
}
T& operator=(const T& p)
{
value = p;
return value;
}
EnumType& operator=(const EnumType& p)
{
if (this != &p) { // make sure not same object
this->label = p.label;
this->value = p.value;
}
return *this;
}
};
我有几个问题:
-
你们能告诉我更好的解决方案吗? 我不确定我是否为了自己的利益而变得太聪明,或者这是否真的是一个可行的解决方案。
-
如果我的解决方案可以接受,那么任何人都可以告诉我如何声明一组
std::set
以便它可以接受任何类型( int、double、string),而我实际上不知道枚举将用于该值的类型?>
如果您有任何代码,那就太好了! :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您的类型集有限且非常稳定,那么 Boost。可以使用变体。
如果您稍后要添加对新类型的支持,那么最好忘记此方法。 在这种情况下,解决方案基于 Boost.Any ,或者一对字符串会更好。
另一个问题是:“这些值以后如何使用?” 如果您要将“SomeInteger”传递给函数并接受 int,您仍然需要运行类似以下的代码:
当您对固定类型集进行统一处理时,此方法效果更好:
If you have limited and very stable set of types, then Boost.Variant may be used.
If you going to add support for new types later, then better forget about this method. In this situation solution, based on Boost.Any, or pair of strings will be better.
Another question is: "How these values will be used later?" If you are going to pass "SomeInteger" to function, accepting int, you still have to run code similar to:
This approach works better when you have uniform processing of fixed set of types:
您看过 Boost.Any 吗? 它应该做你想做的事(如果你需要自己动手,你可以查看源代码以获取提示)。
Have you looked at Boost.Any? It should do what you want (and if you need to roll your own, you can peek at the source for hints).