template <class T, int C> class TtProps
{
private:
T fItems [C];
protected:
inline const T& Get_Item (int Index) const
{return fItems [Index];}
inline void T& Set_Item (int Index, const T &Value) const
{fItems [Index] = Value;}
public:
virtual __fastcall ~TtProps (void) {}
};
// Пример конкретной реализации
class TcMyProps: public TtProps <int, 2>
{
enum TeItems // Перечисление именованых констант для свойств
{itmProp1 = 0, itmProp2};
public:
__property int Prop1 = {read = Get_Item, write = Set_Item, index = itmProp1;}
__property int Prop2 = {read = Get_Item, write = Set_Item, index = itmProp2;}
};
Массив свойств объекта
Все обстоятельства, из-за которых потребовалось решать подобную задачу, перечислять очень долго. И не в этом дело......
Для этого я использовал следующий шаблон - реализация Borland C++ Builder 6
Код:
Вопрос в чём, насколько медленее будет работать данная реализация по сравнению с обычной структурой с открытыми полями, при условии, что функции чтения/записи являются встроенными, а их параметры - предопределёнными ещё на этапе компиляции.
Желательно, с ассемблерными кодами :)
ассемблер ничего не даст надо шарить во внутреннем устройстве объектов С++
А лучше сначала хорошенько обдумать задачу, а потом уж изобретать.
Т.к. не понятно, что значит "множество однотипных свойств".
Кроме того, советую не пользоваться приблудой Borland-а __property, не вписывается она в парадигму С++.
Так как ты используешь inline, то скорее всего с такой же скоростью
Цитата:
А лучше сначала хорошенько обдумать задачу, а потом уж изобретать.
Т.к. не понятно, что значит "множество однотипных свойств".
Т.к. не понятно, что значит "множество однотипных свойств".
Под "множеством однотипных свойств" я подразумеваю именно это самое: 5, 10, .... полей одного (любого) типа.
А задача может быть простой: десяток, два подобных структур, для каждой из которых требуется стандартный набор действий - это не только генерируемое "по умолчанию" присваивание, но и "обнуление", а также сравнение. Стоит условие такой задачи решения ;)?
Первое можно сделать простым присваиванием значения "нулевого" константного объекта (требует объявление для каждого типа и накладно)
А вот второго без написания operator == много-много раз, не обойдёшься :(
Зато можно один раз в шаблоне реализовать два/три цикла (по одному на каждый метод), и клепать структуры, как на конвейере - только успевай имена для свойств придумывать.
Если свойства однотипные, то это скорее всего коллекция, т.е. набор однотипных элементов. Реализаций коллекций существует множество.
Имхо, потери в скорости будут незначительны и удобство использования их окупит.
А потери будут, в частности, из-за вызовов функций Get/Set
Имхо, потери в скорости будут незначительны и удобство использования их окупит.
А потери будут, в частности, из-за вызовов функций Get/Set[/QUOTE]
Не будет потерь на Get/Set, т.к. они inline.
Кстати, писать inline для метода определяемого в определении класса не обязательно, он и так в этом случае уже inline.
Если свойства однотипные, то это скорее всего коллекция, т.е. набор однотипных элементов. Реализаций коллекций существует множество.[/QUOTE]
В принципе, расширив описание шаблона до template <class Ta, int Ca, class Tb int Cb, ...........> можно сделать и несколько типов свойств. Хотя, мысль, конечно, можно откомментировать весьма разными словами.
А в С++ есть "коллекции"? Как называются классы/типы их реализаций?
Кроме того, можно создать производный шаблон для выполнения таких действий, как чтение/запись объекта для множества источников данных (файл, компонент СУБД.....)
Такое впечатление, что ты просто подойдя несколько с другой стороны и сам того не осознавая, просто, пытаешься создать свой контейнер. :)
Что-то вроде:
Код:
[COLOR="SeaGreen"]#include <map.h>
#include <string.h>[/COLOR]
//...
template <class T>
class TtProps
{
//...
map<string, T> properties;
public:
inline T& operator[](string name)
{
return properties[name];
}
//...
};
#include <string.h>[/COLOR]
//...
template <class T>
class TtProps
{
//...
map<string, T> properties;
public:
inline T& operator[](string name)
{
return properties[name];
}
//...
};