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

Поиск:

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


Бывалый
*


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

Репутация: нет
Всего: 3



Цитата(mes @  6.10.2011,  16:49 Найти цитируемый пост)
просто попытка набросать побольше фичей, без учета возможностей их иоспользования ?

а зачем ограничивать юзера, мало ли что ему может понадобиться?
PM MAIL   Вверх
mes
Дата 6.10.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sahab @  6.10.2011,  19:19 Найти цитируемый пост)
а зачем ограничивать юзера, мало ли что ему может понадобиться? 

я тоже противник ограничений, но давать юзеру пол-лопатки и дырявое ведерко, для меня не что иное как издевательство   smile 

Это сообщение отредактировал(а) mes - 6.10.2011, 21:26


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(boostcoder @  6.10.2011,  19:27 Найти цитируемый пост)
1. функция create().возможные варианты использования:код C++1:2:3:4:5:// при подобном использовании, просто создается объект указанного типа, но не помещается в карту объектов.type1* t1 = reflectpp::create("type1");// при подобном использовании, создается объект указанного типа и помещается в карту объектов name -> ptrtype1* t1 = reflectpp::create("object_name = type1");


Может не reflectcpp::create("obj_name = type1"), а reflectcpp::create("type1", "obj_name")?

И еще мое мнение - раз уж это для C++, не лучше ли будет использовать вместо char* нормальный std::string и классы вместо структур с функциями?


--------------------
user posted image
PM MAIL ICQ   Вверх
mes
Дата 7.10.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(kosmonaFFFt @  7.10.2011,  05:40 Найти цитируемый пост)
 и классы вместо структур с функциями? 

структура с функциями это тот же класс..  иногда удобнее, потому что по умолчанию public.. 



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


pattern`щик
****


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

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



mes, что конкретно Вы хотите сказать? без намеков, пожалуйста.

Цитата(kosmonaFFFt @  7.10.2011,  06:40 Найти цитируемый пост)
Может не reflectcpp::create("obj_name = type1"), а reflectcpp::create("type1", "obj_name")?

тут есть некоторая неопределенность.
Код

// без аргументов, но не сохранять в карту объектов
reflectpp::create("type1");
// с аргументами, но не сохранять в карту объектов.
reflectpp::create("type1", arg0, ...); // <<<<<<<<<<<<<<<<<<<<< 1

// без аргументов, но сохранить в карту объектов. вариант 1.
reflectpp::create("obj_name = type1");
// без аргументов, но сохранить в карту объектов. вариант 2.
reflectpp::create("type1", "obj_name"); // <<<<<<<<<<<<<<<<<<<<< 2


отметки 1 и 2. т.е. вторым аргументом может быть как имя объекта, так и аргумент в конструктор объекта.
хотя я склоняюсь к тому, чтоб обязать юзера паковать аргументы в класс-обертку, например такой: http://liveworkspace.org/code/7f3184c1c270...a6f850de238eccb
Код

#include <iostream>
#include <cassert>

struct args_pack {
   args_pack()
      :_count(0),
      _args{0}
   {}

   template<typename... Types>
   args_pack(const Types&... types)
      :_count(sizeof...(types)),
      _args{&types...}
   {
      static_assert(sizeof...(types) <= _max_args, "error! arguments more then 10.");
   }

   size_t count() const { return _count; }
   const void** args() const { return (const void**)_args; }

private:
   static const size_t _max_args = 10;
   size_t _count;
   const void* _args[_max_args];
};

int main() {
   int i;
   long l;
   const char* cc = "cc";

   args_pack a1(i);
   args_pack a2(i, l);
   args_pack a3(i, l, cc);

   const void** p1 = a1.args();
   assert(a1.count() == 1 && p1[0] == &i);

   const void** p2 = a2.args();
   assert(a2.count() == 2 && p2[0] == &i && p2[1] == &l);

   const void** p3 = a3.args();
   assert(a3.count() == 3 && p3[0] == &i && p3[1] == &l && p3[2] == &cc);
}


Добавлено через 6 минут и 19 секунд
т.е. использоваться это будет как-то так:
Код

reflectpp::invoke("t1.m1", args_pack(i, j));


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


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


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

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



Цитата(boostcoder @  7.10.2011,  09:09 Найти цитируемый пост)
 что конкретно Вы хотите сказать? без намеков, пожалуйста.


ну вот возьмем Ваш последний пример.. 
Цитата(boostcoder @  7.10.2011,  09:09 Найти цитируемый пост)
  const void* _args[_max_args];

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



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


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


pattern`щик
****


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

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



Цитата(mes @  7.10.2011,  11:11 Найти цитируемый пост)
зачем тогда нужна вся rtti_ex, если в конечном счете никакой безопасности при передачи аргументов ?

что конкретно я не правильно делаю? объясните.
PM WWW   Вверх
boostcoder
Дата 7.10.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  7.10.2011,  11:11 Найти цитируемый пост)
пол-лопатки

половина лопаты? а в чем смысл фразы?
PM WWW   Вверх
mes
Дата 7.10.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  7.10.2011,  11:03 Найти цитируемый пост)
что конкретно я не правильно делаю? объясните. 

не связываете объекты с рантайм информацией..

Добавлено через 2 минуты
Цитата(boostcoder @  7.10.2011,  12:35 Найти цитируемый пост)
половина лопаты? а в чем смысл фразы? 

так объсните что я могу делать с void* , если тип задан в рантайме..

Добавлено через 4 минуты и 48 секунд
Вы оглядываетесь на языки (ява, шарп и т.д.) и думаете почему в них есть рефлексия и все плюшки для простых типов, а Вам на С++ нельзя... так ?
так в тех языках, эти простые типы далеко не так просты, и каждый является объектом.. т.е. (как минимум) имеет ссылку на тип, к которому он принадлежит..
а так же существует целый ряд правил, о совместимости этих типов..

Добавлено через 8 минут и 15 секунд
кстати c++/cli (для .net) тоже умеет многое из названного, но зато какими жертвами.. 
smile


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


pattern`щик
****


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

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



Цитата(mes @  7.10.2011,  13:37 Найти цитируемый пост)
не связываете объекты с рантайм информацией..

+
Цитата(mes @  7.10.2011,  13:37 Найти цитируемый пост)
так объсните что я могу делать с void* , если тип задан в рантайме..

= Ваши предложения?
PM WWW   Вверх
kosmonaFFFt
Дата 7.10.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(boostcoder @  7.10.2011,  14:09 Найти цитируемый пост)
Цитата(kosmonaFFFt @  7.10.2011,  06:40 )Может не reflectcpp::create("obj_name = type1"), а reflectcpp::create("type1", "obj_name")?тут есть некоторая неопределенность.


Я тут подумал, и, по моему, регистрация уже созданных объектов в ком-нибудь словаре по имени немного из другой области - обычно такая функциональность встречается в IOC контейнерах и к reflection отношения имеет мало, например в Java и C# в reflection такого нет...

Передача параметров в виде "obj_name = type1" тоже на мой взгляд неудачна, т. к. во первых придется писать парсер выражений, а во вторых нарушается статичекая типизация C++... Если и делать регистрацию объектов в контейнере, то лучше отдельным методом...

Цитата(mes @  7.10.2011,  13:06 Найти цитируемый пост)
Цитата(kosmonaFFFt @  7.10.2011,  05:40 ) и классы вместо структур с функциями? структура с функциями это тот же класс..  иногда удобнее, потому что по умолчанию public.


Я имел в виду, что не лучше ли сделать вместо структуры rtti_ex и функций по работе с ней класс, например RttiEx, получать объект этого класса для типа и работать дальше с ними... Примерно так:
Код


class MySuperClass {
...
};

int main(...) {
   
    RttiEx myClass = RttiEx::get("MySuperClass"); // или например RttiEx myClass("MySuperClass");
    void* obj = myClass.create(/* тут могут быть аргументы конструктора */);
    
    Field f = myClass.getFields()[0];
    f.setValue(obj, "SuperFieldValue"); // Например так можно задавать значение поля через reflection.

    // А например так можно сделать вызов методов...
    for (RttiEx::MethodIterator mit = myClass.getMethods().begin; mit != myClass.getMethods().end(); ++mit) {
        void* result = mit->invoke(obj /*, тут могут быть параметры метода, а могут и не быть... */);
    }
}


Соответственно классы RttiEx, Field, Method из вышеприведенного примера будут реализованы в reflection-библиотеке и предоставлять универсальный механизм для работы с объектами и классами в рантайме...


Это сообщение отредактировал(а) kosmonaFFFt - 7.10.2011, 13:51


--------------------
user posted image
PM MAIL ICQ   Вверх
boostcoder
Дата 7.10.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



mes, reflectpp::create() используется только в с++ коде. это библиотечная реализация.
далее, в той самой функции(которую будет создавать компилятор) которая создает объект одного типа, я буду генерить каст из указателей на void в нужный тип. и после этого передавать в конструктор.
если Вы об этом.

Добавлено @ 14:01
Цитата(kosmonaFFFt @  7.10.2011,  13:50 Найти цитируемый пост)
регистрация уже созданных объектов в ком-нибудь словаре по имени немного из другой области - обычно такая функциональность встречается в IOC контейнерах и к reflection отношения имеет мало, например в Java и C# в reflection такого нет...

это нужно для binding`а с++ кода с run-time скриптом. т.е. скрипт может обращаться к объектам созданным не им только в том случае, если эти объекты зареганы в мапе. сам же скрипт, будет регать все объекты которые создает.

Цитата(kosmonaFFFt @  7.10.2011,  13:50 Найти цитируемый пост)
во первых придется писать парсер

это меньшее о чем я беспокоюсь.

Цитата(kosmonaFFFt @  7.10.2011,  13:50 Найти цитируемый пост)
во вторых нарушается статичекая типизация C++

так в том то и смысл.

Цитата(kosmonaFFFt @  7.10.2011,  13:50 Найти цитируемый пост)
не лучше ли сделать вместо структуры rtti_ex и функций по работе с ней класс, например RttiEx, получать объект этого класса для типа и работать дальше с ними... Примерно так:

нет. rtti_ex_ - это внутренние структуры. они используются только внутрях всего этого дела.
юзер же работает с class_ и member_. смотрите: http://liveworkspace.org/code/f6f7dc0eb32d...a001570e37d93ec

Добавлено @ 14:01
Цитата(kosmonaFFFt @  7.10.2011,  13:50 Найти цитируемый пост)
классы RttiEx, Field, Method

rtti_ex_ у юзера не будет. будут class_ и member_.

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


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


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

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



Цитата(boostcoder @  7.10.2011,  12:53 Найти цитируемый пост)
юзер же работает с class_ и member_. смотрите: http://liveworkspace.org/code/f6f7dc0eb32d...a001570e37d93ec

только вот не компилится..

Добавлено через 1 минуту и 52 секунды
ну да ладно..



Код

struct member_ {
   member_type_ type() const {}
   const char* name() const {}
   size_t offset() const {}
   
   template<typename... Args>
   void invoke(void* ptr, const Args&... args) {std::cout<<__PRETTY_FUNCTION__<<std::endl;}
   

и зачем в динамическом методе нам шаблон ?!

Добавлено через 4 минуты и 52 секунды
Цитата(boostcoder @  7.10.2011,  12:49 Найти цитируемый пост)
Цитата

не связываете объекты с рантайм информацией..


+
Цитата

так объсните что я могу делать с void* , если тип задан в рантайме..


= Ваши предложения? 

ну вот например связка :
http://liveworkspace.org/code/5b558ca8d6b8...4616b3222f3422d

гарантирующая правильное создание удаление, и дополняется возможностью проверки совместимости типов.. 
ну и создание по имени то же не за горами smile




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


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(boostcoder @  7.10.2011,  17:53 Найти цитируемый пост)
это нужно для binding`а с++ кода с run-time скриптом. т.е. скрипт может обращаться к объектам созданным не им только в том случае, если эти объекты зареганы в мапе. сам же скрипт, будет регать все объекты которые создает.

Извините за немного оффтоп... Вам рефлекшн нужен только для скриптинга? Просто по моему рефлекш к скриптингу имеет мало отношения, просто он может при этом использоваться, а может и не использоваться...


--------------------
user posted image
PM MAIL ICQ   Вверх
boostcoder
Дата 7.10.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  7.10.2011,  14:15 Найти цитируемый пост)
только вот не компилится..

lда. недописал, ибо некоторые моменты не ясны. собственно этим и занимаюсь.

Цитата(mes @  7.10.2011,  14:15 Найти цитируемый пост)
и зачем в динамическом методе нам шаблон ?!

его там не будет. по идее, там будет args_pack.

Цитата(mes @  7.10.2011,  14:15 Найти цитируемый пост)
ну вот например связка :
http://liveworkspace.org/code/5b558ca8d6b8...4616b3222f3422d

гарантирующая правильное создание удаление, и дополняется возможностью проверки совместимости типов.. 
ну и создание по имени то же не за горами

осмыслить нужно...

Добавлено через 2 минуты и 41 секунду
Цитата(kosmonaFFFt @  7.10.2011,  14:23 Найти цитируемый пост)
Вам рефлекшн нужен только для скриптинга?

нет. это предполагаемая финальная возможность.
основная же цель - привнести в с++ расширенную информацию о типах, плюс, динамические плюшки для операций с типами.

Добавлено через 11 минут и 16 секунд
Цитата(mes @  7.10.2011,  14:15 Найти цитируемый пост)
ну вот например связка :
http://liveworkspace.org/code/5b558ca8d6b8...4616b3222f3422d

понял. о чем-то подобном я писал выше. но я предполагал что rtti_ex_ должен содержать в себе указатели на функции, которые плагин будет генерить для каждого типа. и при инициализации глобального массива rtti_ex_ привязывать каждый элемент к своим функциям.
PM 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.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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