LINUX.ORG.RU

typeid или dynamic_cast()

 


0

3

Допустим, существует следующая иерархия классов:

class A{
public:
    A(){}
    virtual void m(){}
};

class B: public A{
public:
    B(){}
    virtual void m(){}
};

Как правильнее приводить А* к В*: при помощи dynamic_cast или typeid + static_cast, при условии, что я знаю, что объект не может быть наследником B?

★★★★☆

Если ты точно знаешь тип - static_cast без typeid, если ты не знаешь тип - ты что-то делаешь не так.

Stil ★★★★★ ()
Ответ на: комментарий от Deleted

Подходит, и typeid тоже подходит. Интересно ваше мнение по этому вопросу. typeid + static_cast, по-идее, должены быть быстрее, но не позволяют приводить дочерние классы к требуемому.

Tweaker ★★★★☆ ()
Ответ на: комментарий от Stil

Допустим, у меня есть фабрика объектов имеющих общего предка, в которую передается enum определяющий тип объекта, и она возвращает указатель на этого общего предка. Все это складывается в один контейнер. Затем мне нужно достать из этого контейнера объекты одного конкретного класса, я это могу сделать либо через typeid, либо через dynamic_cast. Что именно я делаю не так?

Tweaker ★★★★☆ ()
Ответ на: комментарий от Tweaker

я это могу сделать либо через typeid, либо через dynamic_cast

Либо ты можешь фасовать объекты по разным контейнерами при создании

Stil ★★★★★ ()
Ответ на: комментарий от Tweaker

Затем мне нужно достать из этого контейнера объекты одного конкретного класса

Не нужно.

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

AIv ★★★★★ ()
Ответ на: комментарий от vertexua

Мне кажется что получить информацию из RTTI таблицы быстрее чем пробегать по всему дереву наследования в поисках подходящего класса.

Сейчас простенький пример прогнал, typeid + static_cast работают в 3-4 раза быстрее в зависимости от раскидистости дерева наследования.

Tweaker ★★★★☆ ()
Последнее исправление: Tweaker (всего исправлений: 1)
Ответ на: комментарий от AIv

+100500

Вот говорят же людям - в дизайне косяк, в дизайне. А они в ответ - что быстрее дайнэмик или статик? Что быстрее, костыли или ходули?

Это же надо уметь на обычной абстрактной фабрике так изворачиваться. Диагноз, если коротко, такой: абстрактная фабрика была придумана для вашего удобства. Она специально не знает, объекты какого именно конкретного типа создает. В этом ее так сказать мэйн бенефит. Если это поведение вам неудобно, то какой вывод?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.