Название: как получить список интерфейсов, реализуемых классом? Отправлено: Авварон от Февраль 01, 2011, 21:38 сабж
есть идея воспользоваться QMetaObject::d.stringdata Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Akon от Февраль 01, 2011, 22:40 А если не QObject тип?
Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Авварон от Февраль 01, 2011, 23:30 А если не QObject тип? Этот ответ мне известен - никакНазвание: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Denjs от Февраль 02, 2011, 00:05 ;D это сам спросил, сам ответил, и вообще)))) ;D
мне вот тоже думается, что узнать список интерфейсов в чистом C++ - никак. но, далее я начинаю плавать - поправьте меня - вероятно можно узнать реализует-ли класс заданный интерфейс через objectcast ссылки на объект к типу-прототипу .... Интерфейсы же в С++ реализуются фактически через наследование? вот значит если удается привести ссулку на объект к заданному типу - то наверное он это реализует... не? Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Авварон от Февраль 02, 2011, 00:24 Делать 100 кастов на все интерфейсы? Нет, спасибо.
Для куобжектов - можно пробежаться по иерархии через QMetaObject::superClass() и сравнить указатели. Но это не сработает для Q_INTERFACES - у них нет метаобжекта. А мне надо для них. Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Waryable от Февраль 02, 2011, 06:50 Хм. Что значит список интерфейсов?
Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: _govorilka от Февраль 02, 2011, 07:00 Мос генерирует следующею функцию: Код: void *FwGraphicsView::qt_metacast(const char *_clname) Эта функция вызывается, чтобы проверить можно привести объект QObject к интерфейсу с именем "B". По содержимому видно, что словаря внутри нет. Можно поступить двумя способами: 1. Либо написать цикл который последовательно будет дергать qt_metacast и проверять вернулся 0 или нет. 2. Слегка модифицировать Moc, что вместо последовательности if(!strcmp(...)), он создавал словарь. Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Igors от Февраль 02, 2011, 10:43 Непонятно: это для "класса" (типа) или "указателя на объект" (экземпляра)? (разница есть).
Неоднократно замечал что походы в эту сторону (попытки создать такую общую конструкцию) кончаются плачевно - в лучшем случае массой потерянного времени. Уместен банальный вопрос "а для чего это нужно?" Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: _govorilka от Февраль 02, 2011, 12:52 Уместен банальный вопрос "а для чего это нужно?" Думаю, Авварон собрался делать что-нибудь на подобие этого: http://ru.wikipedia.org/wiki/Remote_Procedure_Call (http://ru.wikipedia.org/wiki/Remote_Procedure_Call) Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: kirill от Февраль 02, 2011, 19:02 Уместен банальный вопрос "а для чего это нужно?" Думаю, Авварон собрался делать что-нибудь на подобие этого: http://ru.wikipedia.org/wiki/Remote_Procedure_Call (http://ru.wikipedia.org/wiki/Remote_Procedure_Call) Забавно, на rsdn есть аналогичный вопрос от Анонима. Уж не одно ли это лицо? http://кывт.рф/forum/cpp.qt/4139933.1.aspx Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: Авварон от Февраль 02, 2011, 19:09 нет, это не рпц и там спрашивал не я. Все гораздо проще - для типа Т сделать класс, к-ый будет "обрабатывать" экземпляры классов в том случае, если они реализуют интерфейс Т. Да, это делается через попытку каста, но сложность такого алгоритма - О(N), где Н - кол-во интерфейсов, в то же время в моем способе - О(почти 1) (на самом деле от m, где m - глубина иерархии, которая очень часто 1 - интерфейс/реализация)
Igors Да, поправка - по указателю на объект. _govorilka Разве мок не прописывает имена интерфейсов в метаобжект наследника? Название: Re: как получить список интерфейсов, реализуемых классом? Отправлено: _govorilka от Февраль 03, 2011, 07:49 _govorilka Разве мок не прописывает имена интерфейсов в метаобжект наследника? Исходник функции, это единственное упоминание об имени интерфейса в файле moc_*. Макросы Q_DECLARE_INTERFACE тоже вызывают её. Если бы все имена записывались в один массив (строку), то 5 if(...)..., там бы не было. Если ошибаюсь - поправте. Посмотрите как реализован механизм Wraper'ов в QtScript. Возможно он подскажет правильное решение. |