- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
function s(v: any): v is string
{
return typeof v === "string";
}
function main()
{
print(s("sss"));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
function s(v: any): v is string
{
return typeof v === "string";
}
function main()
{
print(s("sss"));
}
А ты так можешь на С/C++ .. а я могу....
ASD_77 10.11.2021 22:35 # 0
ISO 10.11.2021 22:49 # 0
https://wandbox.org/permlink/L4SDEH8qBxpMzbrl
guest6 10.11.2021 22:59 # 0
типа можно маттерин патчинг запилить?
Soul_re@ver 10.11.2021 23:01 # 0
guest6 10.11.2021 23:04 # 0
Тормозить будет адски, но красиво
bormand 10.11.2021 23:06 # +1
guest6 10.11.2021 23:08 # 0
эксепшен летит если там ссылка, а если указатель то как раз нул и будет?
bormand 10.11.2021 23:10 # 0
guest6 10.11.2021 23:11 # 0
Там сначала проверяешл тип, потом кастишь
А вкотлине уже нет
bormand 10.11.2021 23:12 # 0
guest6 10.11.2021 23:13 # 0
получаешь указатель, проверяешь typeid, и вот
bormand 10.11.2021 23:17 # 0
Как-то так вроде это пишется. Ни разу не юзала, на самом деле, так что могу ошибиться...
bormand 10.11.2021 23:08 # 0
guest6 10.11.2021 23:12 # 0
bormand 10.11.2021 23:15 # 0
Soul_re@ver 10.11.2021 23:27 # 0
bormand 10.11.2021 23:28 # 0
Desktop 10.11.2021 23:30 # 0
Получается, только выносить его в отдельную лямблию и передавать два раза?
Soul_re@ver 10.11.2021 23:46 # +1
или воспользоваться шаблономагией:
А, понял вопрос. не на то отвечал.
Можно с auto и if constexpr в лямбде.
Desktop 11.11.2021 00:03 # 0
Soul_re@ver 11.11.2021 00:06 # 0
HO9I6PbCKuu_neTyx 11.11.2021 10:02 # 0
guest6 10.11.2021 22:54 # 0
ASD_77 11.11.2021 01:20 # 0
bormand 11.11.2021 08:06 # 0
ISO 11.11.2021 19:37 # 0
> typeof v
guest6 11.11.2021 19:40 # 0
Или это детали реализации, и с точки зрения программиста RTTI есть всегда?
ISO 11.11.2021 19:50 # 0
(RT)TI в крестах бывает разный:
1. dynamic_cast: работает для виртуальных объектов за счёт таскания с собой уко-ко-козателя на vtable;
2. typeid(X), где X — ссылка/указатель на невротуальный объект: работает в компайлтайме и всегда возвращает информацию о статическом типе X;
3. typeid(V), где V — ссылка/указатель на вротуальный объект: работает уже в рантайме за счёт проверки указателя на vtable.
Возможно, ещё что-то я пропустил, но не суть.
В общем и целом, рантайм-расходы на RTTI есть только для виртуальных объектов, которые таскают за собой таблицу вротуальных функций; для всех остальных typeid() разрешается в компайлтайме.
guest6 11.11.2021 19:56 # 0
Но это же по сути оптимизация компилятора: он МОЖЕТ статически проверить тип, вот и проверяет, а название осталось
В жавке все говно витуальное и такой оптимизации нет (хотя ее может JIT наверное)
ISO 11.11.2021 19:58 # 0
bormand 11.11.2021 20:00 # 0
Вроде только какой-нибудь std::is_same можно...
guest6 11.11.2021 20:06 # 0
bormand 11.11.2021 20:08 # −1
guest6 11.11.2021 20:01 # 0
А бывает так, что компилятор не умеет в RTTI, и тогда typed взять у невиртуального питуха можно, а у виртуального (ну точнее у ссылки на нево) нельзя?
bormand 11.11.2021 20:07 # 0
А когда включен, тупо линкер выбрасывает неиспользованное.
guest6 11.11.2021 20:10 # 0
bormand 11.11.2021 20:16 # +1
bormand 11.11.2021 20:45 # +1
ASD_77 11.11.2021 21:49 # 0
gostinho 13.11.2021 01:03 # 0