Как жаль что в качестве параметра шаблона нельзя использовать имя (symbol) на базе которого можно было бы создавать имена функций, переменных и т.п.
Вот пример:
template <class T, symbol Name>
class Property {
T Name.value_;
public:
T Name.get() { return Name.value_; }
void Name.set( const T &val ) { Name.value_ = val; }
};
Такая фича могла бы порешать целую кучу проблемм, начиная от пропертей и кончая бог знает чем. Например очень удобно было бы составлять классы:
class Table { // Таблица в БД - базовый класс
void property_get( const char *name, void *pv, const type_info &nfo );
void property_set( const char *name, const void *pv, const type_info &nfo);
};
// поле таблицы. Шаблон с символом:
template <class T, class Self, symbol Name>
struct Field {
Self& self() { return *static_cast<Self*>(this); }
void Name.set( const T &val ) {
self().property_set( toString<Name>(), &val, typeid(T) );
}
T Name.get() {
T retVal;
self().property_get( toString<Name>(), &retVal, typeid(T) );
return retVal;
}
Name.operator T() {
return Name.get();
}
T Name.operator = ( const T &val ) {
Name.set(val); return val;
}
};
// Таблица составленная из полей
class MyTable
: Table
, Field<int,MyTable,ID>
, Field<string,MyTable,Text>
{
};
// юзаем так:
extern MyTable tbl;
void test() { // Вызывается метод:
int id = tbl.ID.get(); // Field<int,MyTable,ID>::Name.get();
id = tbl.ID; // Field<int,MyTable,ID>::Name.operator T();
tbl.ID.set( id + 1 ); // Field<int,MyTable,ID>::Name.set();
tbl.ID = id + 1; // Field<int,MyTable,ID>::Name.operator =();
string s = tbl.Text; // Field<int,MyTable,Text>::Name.operator T();
tbl.Text.set( "zzzz"); // Field<int,MyTable,Text>::Name.set();
}