Вот такое нихрена не работает void printTypeInfo<T>(const T *obj) { const char *name = typeid(obj).name(); std::cout << "typeof(" << obj << ") = " << name << std::endl; } Пишет просто typeof(0x100a435c0) = PKv typeof(0x1009ad190) = PKv typeof(0x1009b0d38) = PKv typeof(0x1009b0cb8) = PKv typeof(0x7fd106007000) = PKv typeof(0x7fd1060086f8) = PKv
Это не в рантайме работает, а на этапе компиляции. Если хочется узнать шаблонный параметр, то есть трюк: template<typename> struct DisplayType{}; // где-нибудь DisplayType<T>{}; // где хотим увидеть тип Компилятор попробует инстанцировать шаблон, не получится, ругнётся, в ошибке напишет тип полностью и откуда так вызвали. Если же T на самом деле полиморфный и нужен динамический тип объекта в рантайме, то только typeid, причём надо его брать не от указателя, а от разыменованного указателя. Чтобы расшифровать — либа, я лично пользуюсь boost::core::demangle.
Я понимаю, что выполняется мономорфизация. Я прошу подсказать решение, чтобы попросить компилятор не стирать тип после мономорфизации. И да, мне нужно именно в рантайме.
Компилятор и не стирает тип, просто typeid - не тот инструмент.
Я попробовал передавать в typeid разыменованный *obj, чуда не произошло. typeof(0x10e02b5c0) = v typeof(0x10df94190) = v typeof(0x10df97d38) = v typeof(0x10df97cb8) = v typeof(0x7ff3aa800000) = v typeof(0x7ff3aa8016f8) = v причём я точно знаю, что второй и третий объекты - это какой-то unordered_set. Попробую nameof, потом видно будет.
Покажи вызов printTypeInfo. Там передаётся const void*?
И ты забыл добавить что все это ещё и работает не всегда, и по разному. Но здорово!
Тебе он мало поможет. Ну раз спросил, вот: fn xxx() { let unit_set = ...; unsafe { ffi::printTypeInfo(unit_set as *const ffi::Unitset as *const ffi::c_void); } }
:) Из void* нельзя достать информацию об изначальном типе.
И я плохо себе представляю прокидывание шаблона через ffi, там скорее всего торчит printTypeInfo<void>, который уже точно знает, что T == void.
Ты хочешь невозможного. Даже в расте же эта информация не хранит в рантайме. Проще тогда макросом создавать "класс-описатель", который знает это имя
я надеялся эти объекты какие-то хвосты RTTI тащат и я могу сделать typeid с помощью nameof я надеюсь сделать переходник на C++, шаблонная функция будет в плюсовой части, а наружу будет выставляться нормальная функция.
Шаблоны через ffi не прокинуть, если конечно не инстанцировать заранее нужный набор (но тогда смысл задачи теряется). void* хвосты не тащит. Если сделать общую полиморфную базу, то она тащить будет (typeid(*obj) даст рантайм тип)
Чё за Раст в чате по плюсам?
Там unsafe, всё нормальо 😃
Имхо, оффтоп, но пусть админы решают...
Человек дергает кресты из другого языка по ffi. Вопрос задает по крестовой части. Раст приложил на просьбу людей. Таки не совсем оффтоп, ящитаю
Там другая проблема. Человек занимается не своим делом.
Это всё разъясняет...
Откуда такой снобизм, уважаемый?
Из житейского опыта...
У меня есть задача, я её решаю, не больше и не меньше.
Есть ненулевая вероятность что ты не ту задачу решаешь (читай XY problem)
Есть ненулевая вероятность, что я владею контекстом, а ты ссылаешься на слишком общий, и поэтому слишком бесполезный pitfall. Такого не может быть, не? Вообще, один из самых полезных советов был от @unterumarmung , с помощью библиотеки nameof действительно разрешились некоторые из проблем: void printTypeInfo(T obj) { std::cout << "typeof(" << obj << ") = " << NAMEOF_TYPE(T) << std::endl; } typeof(0x106bd1cb8) = const s4api::Unitset * я, заметим, именно это и спрашивал в самом первом сообщении сегодня...🤷♂️
Дак это compile time, не?
Ну теперь уже и до рантайма недалеко.
Обсуждают сегодня