Re: структуры с метаданными
От: np9mi7 Россия  
Дата: 19.07.06 06:34
Оценка: 3 (1)
Здравствуйте, x-code, Вы писали:

здесь
Автор(ы): Владислав Юдин
Дата: 22.05.2005
Цель данной статьи — показать, что метаданные это мощный механизм, требующий выделения в отдельный компонент, который хотелось бы видеть в стандартной библиотеке С++.
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
структуры с метаданными
От: x-code  
Дата: 18.07.06 18:08
Оценка:
Привет всем! пришла в голову мысль, что неплохо было бы создать такие макросы или шаблоны, чтобы описывать структуру с какими-либо метаданными (числовыми или строковыми константами)

STRUCT(MyPoint, "Точка")
DECLARE(int, x, "Первая координата")
DECLARE(int, y, "Вторая координата")
END_STRUCT()

это должно развертываться в обычное описание структуры и некоторые статические данные,
привязанные к каждому полю структуры. Структура путь наследуется от класса со статическими функциями, в которых реализуется некоторая функциональность — например:

получить текстовое имя переменной по смещению
char *p = MyPoint::GetName( &MyPoint::x );

загрузить из ini-файла или из xml
MyPoint pt;
MyPoint::LoadFromIni(&pt, "data.ini");

и т.д.

Но как это сделать??? Вариант с const static внутри структуры (который можно инициализировать прямо в процессе декларации структуры) проходит только на VS2006, а хочется чтобы работало и на VS6 и на VS7.1.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: структуры с метаданными
От: zaufi Земля  
Дата: 19.07.06 08:53
Оценка:
Здравствуйте, x-code, Вы писали:

XC>STRUCT(MyPoint, "Точка")

XC> DECLARE(int, x, "Первая координата")
XC> DECLARE(int, y, "Вторая координата")
XC>END_STRUCT()

нужно разделить объявление и инициализацию: можно задефайнить список желаемых полей и потом в 2 этапа сделать объявления по списку и потом гденибуть наруже структуры сделать инициализацию статиков по тому же списку...

struct MyPoint
{
#define MYPOINT_DATAMEBERS \
  ((Точка)) \
  ((int, x, Первая координата)) \
  ((int, y, Вторая координата))

  PP_DECLARE_STRUCT_DATAMEMBERS(MYPOINT_DATAMEMBERS);
};

PP_INITIALIZE_STRUCT_METADATA(MYPOINT_DATAMEMBERS);


както так это вполне себе возжмножо устроить

еще вариант подумать над своим препроцессором -- a la `moc` из QT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.