Я пытаюсь создать Enum, который имеет строковую метку и значение, и я планирую использовать это для чтения содержимого из 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<EnumType<...>>
, чтобы он мог принимать любой тип (int, double, string), и я не знал, какой тип перечисления будет использовать для значения?
Если у вас есть какой-либо код, это было бы здорово! :)