Если я правильно понимаю ваш вопрос, если у вас есть 30 структур (таблиц) в вашей «базе данных», вы хотите найти все структуры, которые имеют «empid» в виде столбца (то есть члена структуры)? В C ++ я не знаю механизма для проверки того, имеет ли структура определенный член по имени, по крайней мере, по имени, предоставленному во время выполнения. Вы должны хранить это в некоторой форме «метаданных» - например, сопоставления со строковыми ключами, которые, например, перечисляют набор структур (или закодированы в логике со сравнением строк и т. д.) ...
Вот примерный набросок ...
Класс "таблица", введенный в тип строки (т.е. структура)
class table
{
// some virtual methods common to all classes..
};
template <typename _Row>
class data_table : public table
{
// methods
// real data
std::vector<_Row> data;
};
тогда вам нужен класс базы данных для хранения всех таблиц ..
class database
{
// methods
std::map<int, boost::shared_ptr<table> > tables; // here int is for a unique id for table
};
Теперь у вас есть коллекция таблиц, где каждая таблица представляет собой набор строк (структур). Затем вам нужно определить некоторые метаданные для базы данных, то есть сопоставить столбцы с таблицами и т. Д.
std::multimap<std::string, boost::shared_ptr<table> > columns;
Это вы должны заполнить, используя ваши знания структур, например, эта карта может содержать, для вашего кода выше:
columns["empid"] = id of table<emp>;
columns["empid"] = id of table<payroll>;
и т.д.
Теперь вы можете передать «запрос» в свой класс «базы данных», где вы говорите что-то вроде «empid» = 1, а затем вы просматриваете карту столбцов и находите все экземпляры таблиц, а затем каждую таблицу. Вы можете запросить с помощью «empid» = 1. Что касается отображения «empid» на действительное поле empid
в структуре emp
, вы должны встроить эту логику в методы в структуре emp
, которая table<emp>
может делегировать (или если вы можете придумать умный способ хранения ссылок на участников ...)
Это всего лишь предложение ...
Или, в качестве альтернативы, рассмотрите возможность использования одной из множества баз данных, которые будут поддерживать реальные запросы, и будут работать как автономные или встроенные!
Edit:
struct emp
{
int empid;
string empname;
template <typename T>
bool matches(const string& field_name, const T& value)
{
if (field_name == "empid")
return empid == value;
else if (field_name == "empname")
return empname == value;
// etc
return false;
}
};
Таким образом, «метаданные» кодируются в логике для теста, вы передаете имя строкового поля, а затем, в зависимости от того, что это, вы сравниваете соответствующее значение ... Это не очень эффективно, но работает ...