Size: a a a

2021 July 14

D

Dmitriy in supapro.cxx
Переслано от Побитый Кирпич...
Это и есть RTTI, только велосипедный
источник

D

Dmitriy in supapro.cxx
Переслано от Serhii Herashchenko
namespace details
{
   static std::uint8_t id_provider()
   {
       static std::uint8_t counter = 0;
       return counter++;
   }

   template <class T>
   std::uint8_t type_id()
   {
       static std::uint8_t id = id_provider();
       return id;
   }
}

class Any
{
   ...
   template <class T>
   T* Get()
   {
       assert(details::type_id<T>() == m_type_id);
       return ...;
   }
   ...
   std::aligned_storage<64, 8> m_small_storage;
   std::uint8_t m_type_id = -1;
}
источник

D

Dmitriy in supapro.cxx
Примерно таким же образом я велосипедил исключения без штатного RTTI
источник

K

Kelbon in supapro.cxx
ну как сохранять деструкторы и т.д. без rtti я и сам сделал, даже проверять правильные ли типы берут и тому подобное, но для этого нужна vtable
источник

K

Kelbon in supapro.cxx
она как я знаю стандартом не обязательна, но разработчики стандартных библиотек, которые и пишут any очевидно знают использует ли их компилятор создание vtables
источник

K

Kelbon in supapro.cxx
так что они могли бы себе это гарантировать
источник

D

Dmitriy in supapro.cxx
Не все ли равно, как работает виртуальный деструктор?
источник

K

Kelbon in supapro.cxx
ну объект any должен же корректно удалить что там лежит, для этого недостаточно просто знать тот или нет тип в него положили
источник

D

Dmitriy in supapro.cxx
Если он требует RTTI, то выкинь свой компилятор это уже не имеет отношения к any :)
источник

D

Dmitriy in supapro.cxx
any хранит type-erased IStorage
источник

K

Kelbon in supapro.cxx
но деструктор то нужно вызывать правильный, нужно его запомнить, делается это через vtables
источник

K

Kelbon in supapro.cxx
(например)
источник

D

Dmitriy in supapro.cxx
template <class Ty>
class Storage: public IStorage
источник

D

Dmitriy in supapro.cxx
Так какое отношение это имеет к any?))
источник

D

Dmitriy in supapro.cxx
Переслано от Dmitriy
Не все ли равно, как работает виртуальный деструктор?
источник

D

Dmitriy in supapro.cxx
Переслано от Dmitriy
Если он требует RTTI, то выкинь свой компилятор это уже не имеет отношения к any :)
источник

DF

Dollar Føølish in supapro.cxx
Ребят а я кстати затупил недавно. Вот у нас согласно  Itanium ABI офсеты до виртуальных баз хранятся по негативному смещению от начала VTable . А почему не надо хранить офсеты до не-виртуальных баз?)
источник

DF

Dollar Føølish in supapro.cxx
у нас же произвольная иерархия наследования может быть от типа интерфейса до конкретного типа, и там могут быть как виртуальные, так и невиртуальные предки
источник

IZ

Ilia Zviagin in supapro.cxx
Надо, наверняка. При множественном наследовании.
источник

DF

Dollar Føølish in supapro.cxx
ну в общем они там не хранятся )
источник