170 похожих чатов

30 ответов

16 просмотров

Вот такое нихрена не работает 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

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Вот такое нихрена не работает void printTypeInfo<...

Это не в рантайме работает, а на этапе компиляции. Если хочется узнать шаблонный параметр, то есть трюк: template<typename> struct DisplayType{}; // где-нибудь DisplayType<T>{}; // где хотим увидеть тип Компилятор попробует инстанцировать шаблон, не получится, ругнётся, в ошибке напишет тип полностью и откуда так вызвали. Если же T на самом деле полиморфный и нужен динамический тип объекта в рантайме, то только typeid, причём надо его брать не от указателя, а от разыменованного указателя. Чтобы расшифровать — либа, я лично пользуюсь boost::core::demangle.

Egor Suvorov
Это не в рантайме работает, а на этапе компиляции....

Я понимаю, что выполняется мономорфизация. Я прошу подсказать решение, чтобы попросить компилятор не стирать тип после мономорфизации. И да, мне нужно именно в рантайме.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я понимаю, что выполняется мономорфизация. Я прошу...

Компилятор и не стирает тип, просто typeid - не тот инструмент.

Alexander Karaev
Компилятор и не стирает тип, просто typeid - не то...

Я попробовал передавать в typeid разыменованный *obj, чуда не произошло. typeof(0x10e02b5c0) = v typeof(0x10df94190) = v typeof(0x10df97d38) = v typeof(0x10df97cb8) = v typeof(0x7ff3aa800000) = v typeof(0x7ff3aa8016f8) = v причём я точно знаю, что второй и третий объекты - это какой-то unordered_set. Попробую nameof, потом видно будет.

Egor Suvorov
Это не в рантайме работает, а на этапе компиляции....

И ты забыл добавить что все это ещё и работает не всегда, и по разному. Но здорово!

Alexander Karaev
Покажи вызов printTypeInfo. Там передаётся const v...

Тебе он мало поможет. Ну раз спросил, вот: fn xxx() { let unit_set = ...; unsafe { ffi::printTypeInfo(unit_set as *const ffi::Unitset as *const ffi::c_void); } }

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Тебе он мало поможет. Ну раз спросил, вот: fn xxx(...

:) Из void* нельзя достать информацию об изначальном типе.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Тебе он мало поможет. Ну раз спросил, вот: fn xxx(...

И я плохо себе представляю прокидывание шаблона через ffi, там скорее всего торчит printTypeInfo<void>, который уже точно знает, что T == void.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Тебе он мало поможет. Ну раз спросил, вот: fn xxx(...

Ты хочешь невозможного. Даже в расте же эта информация не хранит в рантайме. Проще тогда макросом создавать "класс-описатель", который знает это имя

Alexander Karaev
:) Из void* нельзя достать информацию об изначальн...

я надеялся эти объекты какие-то хвосты RTTI тащат и я могу сделать typeid с помощью nameof я надеюсь сделать переходник на C++, шаблонная функция будет в плюсовой части, а наружу будет выставляться нормальная функция.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
я надеялся эти объекты какие-то хвосты RTTI тащат ...

Шаблоны через ffi не прокинуть, если конечно не инстанцировать заранее нужный набор (но тогда смысл задачи теряется). void* хвосты не тащит. Если сделать общую полиморфную базу, то она тащить будет (typeid(*obj) даст рантайм тип)

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Там unsafe, всё нормальо 😃

Имхо, оффтоп, но пусть админы решают...

disba1ancer
Имхо, оффтоп, но пусть админы решают...

Человек дергает кресты из другого языка по ffi. Вопрос задает по крестовой части. Раст приложил на просьбу людей. Таки не совсем оффтоп, ящитаю

Пашечка
Человек дергает кресты из другого языка по ffi. Во...

Там другая проблема. Человек занимается не своим делом.

Ilya Zviagin
Из житейского опыта...

У меня есть задача, я её решаю, не больше и не меньше.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
У меня есть задача, я её решаю, не больше и не мен...

Есть ненулевая вероятность что ты не ту задачу решаешь (читай XY problem)

Kirill Bolshakov
Есть ненулевая вероятность что ты не ту задачу реш...

Есть ненулевая вероятность, что я владею контекстом, а ты ссылаешься на слишком общий, и поэтому слишком бесполезный pitfall. Такого не может быть, не? Вообще, один из самых полезных советов был от @unterumarmung , с помощью библиотеки nameof действительно разрешились некоторые из проблем: void printTypeInfo(T obj) { std::cout << "typeof(" << obj << ") = " << NAMEOF_TYPE(T) << std::endl; } typeof(0x106bd1cb8) = const s4api::Unitset * я, заметим, именно это и спрашивал в самом первом сообщении сегодня...🤷‍♂️

Kirill Bolshakov
Дак это compile time, не?

Ну теперь уже и до рантайма недалеко.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта