LINUX.ORG.RU

Динамический is_base_of

 , ,


0

3

Всем привет!

Во время велосипединия аналога boost::any, мне понадобилась следующая вещь:

struct A {}; struct B : A {};
TypeDescription *d = makeTypeDescription<A>();
cout << d->is_base_of<B>();
Не могу ничего придумать: type_info не предоставляет такой информации (хоть она у него и есть для dynamic_cast), виртуальную функцию шаблонной для передачи в неё типа не сделаешь.

Есть ли какие-нибудь другие варианты?

★★★

Ответ на: комментарий от Pavval

Вроде как из моего вопроса очевидно: чтобы в него можно было класть Derived*, а доставать Base*, но при попытке достать плохой Base*, получать ошибку, а при попытке достать вторую базу, получать правильный каст.

Вроде как это можно делать, копаясь в реальном представлении type_info на большинстве платформ: http://mentorembedded.github.io/cxx-abi/abi.html Но хочется найти не привязанное к платформе решение.

vzzo ★★★
() автор топика
Последнее исправление: vzzo (всего исправлений: 1)

Эм, а проверить удался ли dynamic_cast а потом тупо сравнить типы(чтобы исключить вариант когда оба объекта - одного типа)?

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

Стандарт запрещает пытаться dynamic_cast'ить из void. Ещё dynamic_cast не работает для классов без виртуального поведения.

vzzo ★★★
() автор топика
Последнее исправление: vzzo (всего исправлений: 1)

Это тебе не нужно. А для воссоздания boost::any возьми да посмотри его исходники.

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