По сути, вы должны создавать ассоциации в своем коде.Разобрать входные данные в значениях структуры / поля (например, inputtringstream >> структура >> разделитель >> поле), а затем получить что-то вроде:
if (structure == "emp")
if (field == "empid")
...do something with emp[which_one].empid...
...
Если вам необходимо отделить эти шаги разрешения ссылки откод, который использует значения, тогда вы можете захотеть, чтобы приведенный выше код (то есть «сделать что-то») установил функтор, который вы можете вызывать позже, когда вам нужно фактическое значение.При таком же подходе вы могли бы потенциально улучшить каждую структуру с помощью API, который знает о ее полях:
struct Emp
{
// boost::any can directly return an int, string, double etc...
// you could hack your own union to do this if you needed, or provide
// some common base class around these types
boost::any get(const std::string& identifier) const;
// this one might use std::ostringstream to convert any non-string fields
// into a textual representation, but e.g. you can loose precision
// from floating point values
std::string get(const std::string& identifier) const;
};
Затем вы можете поместить различные методы доступа в одну карту ...
struct Field_Access
{
virtual boost::any get(const std::string& identifier) const = 0;
virtual bool set(const std::string& identifier, const std::string& value) = 0;
virtual bool set(const std::string& identifier, const int& value) = 0;
};
struct Emp : Field_Access
{
...
};
std::map<std::string, Field_Access*> accessors;
... populate accessors ...
accessors["emp"] = emp;
accessors["emp"][which_one].get("empid");
Возможности довольно безграничны, и ваш вопрос недостаточно конкретен, чтобы дать очень целеустремленный совет.