Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> правильная реализация reflection+introspection, в С/С++ путем написания плагина для GCC. 
:(
    Опции темы
boostcoder
Дата 26.7.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  26.7.2011,  15:53 Найти цитируемый пост)
все принимают и возвращают объекты

а Class что возвращает?
PM WWW   Вверх
mes
Дата 26.7.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Class "умееет" создавать объект, знает его размер, может выдать енумерацию полей и функци, а возможно даже прикрепить нужную функцию.. smile




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.7.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, я себе это представлял так:
Код

struct Object {};

struct Value: Object {};
struct Void: Object {};

struct Char: Object {};
struct UChar: Object {};
struct Short: Object {};
struct UShort: Object {};
struct Int: Object {};
struct UInt: Object {};
struct Long: Object {};
struct ULong: Object {};
struct Int64: Object {};
struct UInt64: Object {};
struct Double: Object {};
struct Fload: Object {};
struct String: Object {};

struct Class: Object {};

 smile

Добавлено через 14 минут и 11 секунд
еще не уверен что нужны все эти типы:
Код


struct Char: Object {};
struct UChar: Object {};
struct Short: Object {};
struct UShort: Object {};
struct Int: Object {};
struct UInt: Object {};
struct Long: Object {};
struct ULong: Object {};
struct Int64: Object {};
struct UInt64: Object {};
struct Double: Object {};
struct Fload: Object {};
struct String: Object {};


может нужен только Value у которого должны быть методы для каста его внутреннего значения в нужный тип?

Это сообщение отредактировал(а) boostcoder - 26.7.2011, 16:29
PM WWW   Вверх
mes
Дата 26.7.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Class не состоит в иерархии Object`а.. грубо говоря он служит посредником между строковым именем и созданием объекта...



--------------------
PM MAIL WWW   Вверх
xvr
Дата 26.7.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



2 boostcoder: попробуйте представить часть описания типов из AST в виде иерархии классов - это и будет основа для интроспекции в RTTIEx (a-la Class, точнее его энумераторы)

Когда это более менее устаканится, можно будет переходить к проектированию 2й части интерфейсов Class'а - операции по модификации/вызовам через эти энумераторы

А уж к 3й части - созданию объектов, можно будет переходить когда первые 2 будут готовы.

Иначе у вас получится знатная каша, а не reflection  smile 

PM MAIL   Вверх
boostcoder
Дата 26.7.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  26.7.2011,  18:00 Найти цитируемый пост)
попробуйте представить часть описания типов из AST в виде иерархии классов

а в более расширенной форме объяснить можете? ;)
PM WWW   Вверх
xvr
Дата 26.7.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  26.7.2011,  18:23 Найти цитируемый пост)
а в более расширенной форме объяснить можете? ;) 

Я не знаю спецификацию AST из gcc поэтому точно написать не смогу. Но в общей форме, это должно быть как то так
Код

class Class {
public:
 class member_iterator; // *member_iterator => Member

 member_iterator members_begin();
 member_iterator members_end();
 .... все остальные методы, типа find и пр .........


 Class(const char*); // create from string ID
 Class(void*); // create from Object
};

class Member {
public:
 MemberType get_type();
 const char* get_name();
 size_t get_shift();
 void put_data(void*);
 void get_data(void*);
 void call_method(void* ret_val, std::vector<AnyValue>& args);
};


class MemberType {
public:
 const char* get_type_name();
 TypeKind get_type_kind(); // Returns POD, struct, array, function, member pointer, etc
 MemberType get_nested_type(size_t idx); // For struct, functions, members returns types for struct field, function arg, etc
 size_t get_size();
 size_t get_align();
 ...
};


В общем все эти классы представляют один узел в AST. Для доступа к атрибутам узла и потомкам узла в AST используются методы этих классов

Методы Member::put_data/Member::get_data/Member::call_method используются для 2го уровня - манипуляция с member'ами объекта по имени

Кстати, одной интроспекции недостаточно для стриминга произвольных классов. Стримить указатели, базируясь только на их типах увы не получится - проблемы распределения памяти под данные все равно придется решать вручную  smile 

PM MAIL   Вверх
boostcoder
Дата 26.7.2011, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



xvr, спасибо. сначала попробую реализовать идею в терминах возможностей с++. а тогда уже и видно будет, что есть, а чего не хватает..
PM WWW   Вверх
boostcoder
Дата 26.7.2011, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
TypeKind get_type_kind();

тут TypeKind - enum?

Добавлено через 12 минут и 22 секунды
xvr, еще типа Object не хватает? или так задумано?
PM WWW   Вверх
borisbn
Дата 27.7.2011, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Если wishlist ещё открыт, то могу предложить автогенерацию оператора == по указанным полям.
(как-то не очень понятно получается... щаз попробую на примере)
Код

struct S
{
    int id_1;
    int id_2;
    std::string description; // это так... для довеска
    std::string additional; // тоже
};
#pragma ( gen_operator_eq, S, id1, id2 )

эта pragma (не обязательно pragma... можно что угодно ) должна сгенерить след. код
Код

bool operator==( const S & left, const S & right ) {
    return left.id_1 == right.id_1 && left.id_2 == right.id_2;
}

если же эта прагма стоит внутри структуры/класса, то должен генериться оператор == с одним параметром


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 27.7.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





--------------------
PM MAIL WWW   Вверх
xvr
Дата 27.7.2011, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @ 26.7.2011,  23:11)
Цитата(xvr @  26.7.2011,  21:02 Найти цитируемый пост)
TypeKind get_type_kind();

тут TypeKind - enum?

Да

Цитата

xvr, еще типа Object не хватает? или так задумано?
Можно обойтись и без Object. Просто в VCL Object был введен, что бы отличить VCL классы от нормальных С++ классов. Наследование от Object автоматически включало всю машинерию Delphi классов.
В других языках этот класс автоматически становится в предки любому классу. В С++ такого класса нет, и собственно интроспекция не требует его наличия.

PM MAIL   Вверх
borisbn
Дата 27.7.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, спасибо. Вы последний комментарий читали (от юзера garex) ? smile
Да и не хочется таскать boost только ради этого... плюс к тому скорость этого метода (там же в комментариях замеряли) раза в полтора (!!!) ниже.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 27.7.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



borisbn, принято. это будет самая простая задача smile
PM WWW   Вверх
mes
Дата 27.7.2011, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  27.7.2011,  09:35 Найти цитируемый пост)
Да и не хочется

ссылку дал, как информацию к размышлению, не более  smile 

Это сообщение отредактировал(а) mes - 27.7.2011, 11:30


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0775 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.