Странный вопрос и трудно сказать, но, допустим, у меня есть 2 файла, в которых есть строка того, какие двойные переменные будут отображаться в файле вверху, а затем соответствующие двойные переменные, например:
File1 =
A B C D E
1.2 3.4 4.5 5.6 7.8
File2 =
B D E
9.8 7.6 5.4
и у меня есть структура удвоений
struct numb{
double A,B,C,D,E};
возможно ли читать строку в файле 1 (ABCDE) и независимо от того, что первое значение в строке (A) назначает ей соответствующее значение struct numb.A.
Итак, следующий файл будет прочитан в первом значении строки (B) и присвоит ей numb.B. Я понимаю, что это возможно с кучей утверждений if, но мне было интересно, есть ли более простой способ. Самая сложная часть - строка переменных всегда будет некоторой комбинацией A, B, C, D, E. Я программирую в C++ VS10
Вы можете создать карту со строкой для разбора в качестве ключа и указателем на член соответствующего атрибута вашей структуры в качестве значения.
std::map<std::string, double numb::*> mapLetterToCorrespondingAttribute;
Затем проанализируйте файл и назначьте значение соответствующему члену, на которое указывает значение на вашей карте, соответствующее ключу, которое вы обрабатываете.
Прочитайте это несколько раз, прежде чем говорить, что не понимаете: D
Объявите массив double в struct numb
.
struct numb {
void setValue(char label, double val) { value[label-'A'] = val; }
double getValue(char label) const { return value[label-'A']; }
double value[5];
};
Затем вы можете выполнить:
numb n;
n.setValue('A', 1.2);
double A = n.getValue('A');
Прочитайте две строки в std::vector<std::string>
а затем поместите их в карту в парах:
std::vector<std::string> vars; // the split up first line
std::vector<std::string> values; // split up second line
std::map<std::string, double> mapping;
for (int i = 0; i < vars.size(); ++i) {
mapping.insert(std::make_pair(vars[i], boost::lexical_cast<double>(values[i]));
}
Если вы предварительно заполняете отображение mapping
разумными значениями по умолчанию, это должно быть довольно простым. Кроме того, вы можете подставить вызов boost::lexical_cast<double>
с любым методом преобразования, который вам нравится.
Вероятно, это самый простой способ switch
.
void set_member(numb &n, char member, double value)
{
switch (member) {
case 'A':
n.A = value;
break;
case 'B':
n.B = value;
break;
// etc.
default:
// handle error
}
}