binder
От: Yagg Россия  
Дата: 15.09.03 11:41
Оценка:
Очень хочется засунуть работу с СУБД в отдельный класс, чтобы основная
работа программы шла только с объектами типа
class Person
{
property<int> id;
property<std::string> name;
...
};
и не зависела от запросов, таблиц...

Но тут возникает проблема — как обозначить соответствие между именами
полей в таблице БД и членами класса.
Хочется, чтобы работало примерно следующим образом:
Person p;
property<int>& id = binder<p,"PersonID">;
property<std::string>& name = binder<p,"PersonName">;
То есть по экземпляру класса и строке нужно возвращать ссылку на член
этого класса.
И обратно:
std::string field_name = binder<p,p.id>
То есть по экземпляру класса и ссылке(?) на член возвращать стоку с
названием поля.

Пока я придумал делать только так:
---------------------------------------------------------------
template<class T>
class bounder
{
public:
prop_base& operator()(const std::string& fname, T& obj)
{
}
};

template<class P, class O>
property<P>&
b_cast(O& obj, std::string fld)
{
static bounder<O> b;
return dynamic_cast<property<P>& >( b(fld, obj) );
}

template<>
class bounder<Person>
{
public:
prop_base& operator()(const std::string& fname, Person& obj)
{
if(stolower(fname)=="personid")
return obj.id;
if(stolower(fname)=="personname")
return obj.name;
...
}
};

void f()
{
property<int>& id = b_cast<int>(p, "PersonID");
}
---------------------------------------------------------------
А как сделать наоборот(получить строку по члену класса) придумать не
могу. Единственное, что приходит на ум — использовать offsetof, но это
как-то неправильно с точки зрения ОП...
Может кто сталкивался с такими проблемами? Подскажите как быть...
Может я вообще не то делаю?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.