Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > reflection in C++


Автор: sol78 6.4.2008, 18:06
Доброе вам время суток!
Мне нужно реализовать принцип Reflection, т.е. иметь возможность создавать обьект класс, который определяется Run time

Как это профессиональнее сделать?

Я понимаю что должна быть к-л функ. которая принимает парамет типа "Класс" и возращает птр на обьект типа Класс.
Класс который заинтересован в етом тулсе должен пройти резистрацию, но известно что для регистрации вызывать к-л функ.
ето должно как то делаться в нутри, но как?

Автор: korian 6.4.2008, 18:11
http://www.insidecpp.ru/patterns/factory/

Автор: JackYF 6.4.2008, 21:23
Цитата(sol78 @  6.4.2008,  17:06 Найти цитируемый пост)
Как это профессиональнее сделать?

Если время и нервы присутствуют, можешь посмотреть, как это сделали в QT - класс QMetaType и всё, что с ним связано.
А также почитать "Design Patters", про фабрики и билдеры.

Автор: Любитель 7.4.2008, 00:17
1. Тебе нужно получить способ получения метафинвы о типах. То что даёт стандартно typeid явно не хватит smile Самый простой способ - утила, генерящая по объявлению класса метаинфу в удобной для тебя форме. Удобней (why - см далее), чтоб она генерила сорс-файл, который будет включен в общую сборку (как - уже претензии к билд-системе).

2. Нужна абстракция для вызова методов. Всмысле передача параметров в каком-нибудь invoke в виде массива object специального класса. Плюс должны быть готовые его врапперы для встроенных типов. И шаблонные классы для своих врапперов (предыдущий пункт - на базе этого).

3. Возврат (результаты методов или сконструированный объект) - тоже в виде этого типа. Как достучаться до физического значения? Ничего лучше void* data() я не вижу smile

4. Тебе нужен маппинг "имя класса" -> "объект Type". Этот памминг - один из способов получение объекта класса Type.

5. Но не единственный smile Само собой ты должен иметь возможность получить тип по имеющиемуся объекту. И здесь два пути. Первый - иметь общего предка для типов, поддерживающих рефлекшн с виртуальным методом getType. Реализация этого метода будет генериться утилой из пункта 1. Второй метод - маппить стандартный type_info (указатель на него) и твою нормальную метаинфу. Этот маппинг будет добавляться в статик-инициализации чегот-о нагенеренного пунктом 1 smile


Вот так - навскидку smile

Автор: xvr 7.4.2008, 12:30
Цитата(sol78 @ 6.4.2008,  18:06)
Доброе вам время суток!
Мне нужно реализовать принцип Reflection, т.е. иметь возможность создавать обьект класс, который определяется Run time

Как это профессиональнее сделать?

Я понимаю что должна быть к-л функ. которая принимает парамет типа "Класс" и возращает птр на обьект типа Класс.
Класс который заинтересован в етом тулсе должен пройти резистрацию, но известно что для регистрации вызывать к-л функ.
ето должно как то делаться в нутри, но как?

Посмотри на http://opencxx.sourceforge.net/

Автор: Vyacheslav 8.4.2008, 10:30
Вот простенький прототип решения подобной задачи
http://forum.vingrad.ru/index.php?showtopic=9713&view=findpost&p=60738

Автор: Lazin 8.4.2008, 10:39
Цитата(xvr @  7.4.2008,  12:30 Найти цитируемый пост)
Посмотри на Open C++

не обновлялся с 2004-го.. пациент скорее мертв чем жив =)

Автор: xvr 8.4.2008, 11:16
Цитата(Lazin @ 8.4.2008,  10:39)
Цитата(xvr @  7.4.2008,  12:30 Найти цитируемый пост)
Посмотри на Open C++

не обновлялся с 2004-го.. пациент скорее мертв чем жив =)

Есть реинкарнация http://www.viva64.com/vivacore.php

Автор: Любитель 8.4.2008, 12:26
Ждём автора... Нужен более менее полноценный рефлекшн или только создание объектов (причём наследников какого-то определённого класса) по строковому имени?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)