- 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++ .. а я могу....
https://wandbox.org/permlink/L4SDEH8qBxpMzbrl
типа можно маттерин патчинг запилить?
Тормозить будет адски, но красиво
эксепшен летит если там ссылка, а если указатель то как раз нул и будет?
Там сначала проверяешл тип, потом кастишь
А вкотлине уже нет
получаешь указатель, проверяешь typeid, и вот
Как-то так вроде это пишется. Ни разу не юзала, на самом деле, так что могу ошибиться...
Получается, только выносить его в отдельную лямблию и передавать два раза?
или воспользоваться шаблономагией:
А, понял вопрос. не на то отвечал.
Можно с auto и if constexpr в лямбде.
> typeof v
Или это детали реализации, и с точки зрения программиста RTTI есть всегда?
(RT)TI в крестах бывает разный:
1. dynamic_cast: работает для виртуальных объектов за счёт таскания с собой уко-ко-козателя на vtable;
2. typeid(X), где X — ссылка/указатель на невротуальный объект: работает в компайлтайме и всегда возвращает информацию о статическом типе X;
3. typeid(V), где V — ссылка/указатель на вротуальный объект: работает уже в рантайме за счёт проверки указателя на vtable.
Возможно, ещё что-то я пропустил, но не суть.
В общем и целом, рантайм-расходы на RTTI есть только для виртуальных объектов, которые таскают за собой таблицу вротуальных функций; для всех остальных typeid() разрешается в компайлтайме.
Но это же по сути оптимизация компилятора: он МОЖЕТ статически проверить тип, вот и проверяет, а название осталось
В жавке все говно витуальное и такой оптимизации нет (хотя ее может JIT наверное)
Вроде только какой-нибудь std::is_same можно...
А бывает так, что компилятор не умеет в RTTI, и тогда typed взять у невиртуального питуха можно, а у виртуального (ну точнее у ссылки на нево) нельзя?
А когда включен, тупо линкер выбрасывает неиспользованное.