Назначать значения на основе имени переменной в строке

0

Странный вопрос и трудно сказать, но, допустим, у меня есть 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

Теги:

4 ответа

1

Вы можете создать карту со строкой для разбора в качестве ключа и указателем на член соответствующего атрибута вашей структуры в качестве значения.

std::map<std::string, double numb::*> mapLetterToCorrespondingAttribute;

Затем проанализируйте файл и назначьте значение соответствующему члену, на которое указывает значение на вашей карте, соответствующее ключу, которое вы обрабатываете.

Прочитайте это несколько раз, прежде чем говорить, что не понимаете: D

  • 0
    Хорошее дополнение: представьте эту карту в своем классе или предоставьте метод, который использует эту карту для реализации (даже лучше).
0

Объявите массив 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');
0

Прочитайте две строки в 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> с любым методом преобразования, который вам нравится.

0

Вероятно, это самый простой способ 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
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню