Предположим, у вас есть структура. Внутри этой структуры
* какое-то имя
* две переменные одного типа, но с разным значением
struct foo {
std::string a;
std::string b;
};
Хорошо, теперь давайте представим, что у вас есть куча foo
с в контейнере:
// key: some sort of name, value: a foo instance
std::map<std::string, foo> container;
Хорошо, теперь предположим, что вы загружаете данные из отдельных источников, но данные представлены таким же образом (например, вам нужен тот же метод анализа).
Вы можете сделать что-то вроде этого:
void readDataFromText(std::istream & input, std::map<std::string, foo> & container, std::string foo::*storage) {
std::string line, name, value;
// while lines are successfully retrieved
while (std::getline(input, line)) {
std::stringstream linestr(line);
if ( line.empty() ) {
continue;
}
// retrieve name and value
linestr >> name >> value;
// store value into correct storage, whichever one is correct
container[name].*storage = value;
}
}
std::map<std::string, foo> readValues() {
std::map<std::string, foo> foos;
std::ifstream a("input-a");
readDataFromText(a, foos, &foo::a);
std::ifstream b("input-b");
readDataFromText(b, foos, &foo::b);
return foos;
}
В этот момент вызов readValues()
вернет контейнер с унисоном «input-a» и «input-b»; все ключи будут присутствовать, и у foos есть либо a, либо b, либо оба.