Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Февраль 01, 2011, 21:38



Название: как получить список интерфейсов, реализуемых классом?
Отправлено: Авварон от Февраль 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)
{
    if (!_clname) return 0;
    if (!strcmp(_clname, qt_meta_stringdata_FwGraphicsView))
        return static_cast<void*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "A"))
        return static_cast< A*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "B"))
        return static_cast< B*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "com.fireworks.fwgraphicsview.A/1.0"))
        return static_cast< A*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "com.fireworks.fwgraphicsview.B/1.0"))
        return static_cast< B*>(const_cast< FwGraphicsView*>(this));
    return QObject::qt_metacast(_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. Возможно он подскажет правильное решение.