Фича для расширения шаблонов в С++
От: 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();
}
Re: Фича для расширения шаблонов в С++
От: _nn_ www.nemerleweb.com
Дата: 03.08.04 08:24
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Как жаль что в качестве параметра шаблона нельзя использовать имя (symbol) на базе которого можно было бы создавать имена функций, переменных и т.п.

Жаль...

K>Вот пример:


K>
K>template <class T, symbol Name>
K>class Property {
K>    T        Name.value_;

K>public:
K>    T Name.get() { return Name.value_; }
K>    void Name.set( const T &val ) { Name.value_ = val; }

K>};
K>


Можно сделать так :
#define Property(T,Name) \
class Property { \
    T        Name.value_; \
public: \
    T Name.get() { return Name.value_; } \
    void Name.set( const T &val ) { Name.value_ = val; } \
};

//
Property(int,m) x;
x.set(1);
int y = x.get();
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Фича для расширения шаблонов в С++
От: LaptevVV Россия  
Дата: 03.08.04 09:14
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Как жаль что в качестве параметра шаблона нельзя использовать имя (symbol) на базе которого можно было бы создавать имена функций, переменных и т.п.


Короче, народ все больше хочет от темплейтов возможностей полноценного макропроцессора. Читайте Брауна. У него есть крошечная брошюрка "Макропроцуессоры", которая еще в 80-х вышла у нас, где он прописал ВСЕ. Еще есть две замечательных книжки "Макропроцессоры и мобильность ПО" того же брауна. И Введение в Макросы Кемпбел-келли. Последнюю, кстати, никак не могу найти, а своя в Ташкенте осталась.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Фича для расширения шаблонов в С++
От: iZEN СССР  
Дата: 03.08.04 16:58
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Как жаль что в качестве параметра шаблона нельзя использовать имя (symbol) на базе которого можно было бы создавать имена функций, переменных и т.п.


Зачем тогда ООП как не для моделирования сущностей мира?
Философский вопрос: нужно ли объектам добавлять знания о себе самих?

Похоже на макроязык, который элементарно "сваливается" из ООП в структурное программирование и процедурно-ориентированное программирование. К истокам, господа?
Re[2]: Фича для расширения шаблонов в С++
От: Kluev  
Дата: 04.08.04 07:10
Оценка:
Здравствуйте, iZEN, Вы писали:

ZEN>Здравствуйте, Kluev, Вы писали:


K>>Как жаль что в качестве параметра шаблона нельзя использовать имя (symbol) на базе которого можно было бы создавать имена функций, переменных и т.п.


ZEN>Зачем тогда ООП как не для моделирования сущностей мира?

ZEN>Философский вопрос: нужно ли объектам добавлять знания о себе самих?

ZEN>Похоже на макроязык, который элементарно "сваливается" из ООП в структурное программирование и процедурно-ориентированное программирование. К истокам, господа?


Наоборот, все исключительно для поддержки ООП. Посмотри на пример внимательно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.