Фича для расширения шаблонов в С++
От: Kluev  
Дата: 03.08.04 08:12
Оценка: 18 (1) +1
Как жаль что в качестве параметра шаблона нельзя использовать имя (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();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.