Перечислить все типы (C++ 11)
От: SkyDance Земля  
Дата: 16.09.13 06:30
Оценка:
Хочется совершить некоторый шаг в сторону reflection.

Есть программа, которая хранит свои log-файлы в бинарном проприетарном формате. Выглядят эти дампы довольно изящно — очень "дешевая" в плане скорости работы блочная структура: размер объекта (в байтах), хеш типа объекта — typeid(T).hash_code(), и бинарное содержимое объекта.

Вопрос вот в чем. Можно ли найти конкретный type_info по hash_code()? Или перечислить все type_info. Может, есть какой-то недокументированный ABI? По примеру функции abi::__cxa_demangle у GCC.
Re: Перечислить все типы (C++ 11)
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 16.09.13 08:10
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Хочется совершить некоторый шаг в сторону reflection.


SD>Есть программа, которая хранит свои log-файлы в бинарном проприетарном формате. Выглядят эти дампы довольно изящно — очень "дешевая" в плане скорости работы блочная структура: размер объекта (в байтах), хеш типа объекта — typeid(T).hash_code(), и бинарное содержимое объекта.


А разве вы можете быть уверены в уникальности хэша? Что будет при коллизции (когда два разных типа вернут один хэш)? Да и вообще, никто ведь в общем случае не гарантирует, что хэш код не будет меняться от запуска к запуску или от версии к версии. Поэтому в большинстве платформ сохранять хэш-код для последующего получения объекта не рекомендуется.

Я, конечно, отталкиваюсь от базовых требований к хэш-функциям, возможно ваши хэш-функции дают более строгую гарантию, но я не уверен, что на них можно расчитывать.
Re[2]: Перечислить все типы (C++ 11)
От: SkyDance Земля  
Дата: 16.09.13 22:55
Оценка:
ST>А разве вы можете быть уверены в уникальности хэша?

В gcc да, кроме того, есть pending proposal для внесения этого в стандарт. В любом случае, коллизии такого рода меня не беспокоят на данном этапе. Это первое. Второе — сам вопрос, который не предполагает обсуждение хеша, а куда более конкретен. К сожалению, длительное гугление и даже bing-ование показало, что никто этого не знает, следующим этапом будет копать исходники gcc.
Re[2]: Перечислить все типы (C++ 11)
От: anomander  
Дата: 17.09.13 06:15
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>Здравствуйте, SkyDance, Вы писали:


ST>Да и вообще, никто ведь в общем случае не гарантирует, что хэш код не будет меняться от запуска к запуску или от версии к версии.


This.

Так что, даже если вы сохраните хэш, а потом, каким-то чудесным образом, найдете тип с таким хэшем, то никаким образом не сможете быть уверены, что это тот же самый тип.
Re[3]: Перечислить все типы (C++ 11)
От: SkyDance Земля  
Дата: 17.09.13 06:21
Оценка:
A>Так что, даже если вы сохраните хэш, а потом, каким-то чудесным образом, найдете тип с таким хэшем, то никаким образом не сможете быть уверены, что это тот же самый тип.

Напомню еще раз, вопрос задан совсем другой.
Есть ли способ найти все type_info объекты, или как-то по hash найти нужный type_info?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.