Комментарии 11
Не совсем понял, это перевод какой-то статьи ( не увидел ссылки). Просто gcc-16 уже имеет в себе рефлексию.
А замеры классные. От такого очень много выйгрыша
Это не перевод, это оригинальная статья и библиотека, созданная автором
Это личный проект, не перевод.
Спасибо за замечание, я действительно упустил, что GCC 16 уже поддерживает рефлексию. Добавил UPD с замерами и пуш в проект с поддержкой GCC. Эти замеры, конечно, подрывают посыл статьи, но, надеюсь, добавляют ценности))
Суровая разница между между clang-p2996 и gcc16
Есть шанс что в одном из них просто баг и результирующий type_list неверен или пуст?
Это особенность реализации consteval интерпретатора GCC (часть рефлексии связана с consteval), который выделяет память пропорционально объёму вычислений и не освобождает выделенную память до конца сборки, Clang работает по-другому: потребляет константную память на consteval вычислениях. Видимо, архитектурные особенности.
Перепроверил: замер был действительно на рефлексии, а не провалился на шаблоны, тесты тоже все проходят
Жаль, что нейрослоп, тема-то интересная, но зачем же каждое второе слово делать жирным, почему в нейротекстах это так популярно, неужели только меня это отвлекает так сильно, что текст читать не хочется?
Жаль, что Вы испугались жирного текста (где, кстати?) и не прочитали статью.
Давайте я, как человек, прочитавший всё от начала до конца, расскажу, почему Вы ошибаетесь.
Почему это не нейрослоп? Это отличный вопрос! Здесь есть:
Реальные замеры быстродействия во всевозможных кейсах
Куски кода с подробными объяснениями
Советы, как не
наступитьна те же грабли, что авторАвтор отвечает на комментарии и добавляет UPD в статью
Призываю всех комментаторов, делающих подобные поспешные выводы, сначала прочитать статью, а потом уже писать, что статья - нейрослоп. Либо не писать комментарий вовсе, дабы никого не вводить в заблуждение
Гораздо интереснее, что там будет в ошибках компиляции и как это будет дружить с IDE. Ну и немножко интересно, сколько этажей мусора будет в отладчике.
В целом, если сейчас даже большой шаблон падает - всё, конечно плохо, но любая ИИ-шка за 5 секунд найдет проблемный параметр, да и глазами это возможно, просто дольше
Честно - мусора будет много, итоговые типы получаются длинными и не читаемыми, но во многих местах, где это имело смысл, подложены static_assert, например, в метод get. Если вы пытаетесь взять из коллекции типов то, что туда не клали - сообщение об ошибке явно об этом скажет и стек трейс вызовов будет вполне собираем.
Намного сложнее разобраться, почему в коллекции нет того типа, который, как вы ожидаете, должен там быть. Такое возможно, если в проекте выстроена сложная цепочка маппингов (активно используете метод transform). Тогда отлаживать нужно шаблоны, которые выводятся на этапе компиляции, а не рантайм с привычным стектрейсом. К счастью clangd-based IDE хорошо раскручивают шаблоны и автодополнение по ним нормально работает. Например, набрав engine.get<FrameBuffer>(). IDE корректно подсветит доступное поле width . Также хорошо помогают юнит-тесты.
Все это плата за перенос рантайм ошибок на этап компиляции. Например, если DI не подтянул какой-то сервис в рантайме, то вы узнаете об этом только собрав приложение и запустив его, потом просидите с дебаггером разбираясь, почему DI не отработал как нужно. С предложенным подходом в статье ошибка проявится во время сборки и разбор проблем с кодом просто перейдет в другую плоскость.
Да в целом-то понятно, что платить приходится (правда Haskell тихонько хихикает над нами), но просто интересно насколько много. Например, как быстро начнет тупить IDE, сколько памяти будет жрать и как часто глючить.
Насколько вообще будет поддерживаемый этот код, ведь когнитивная нагрузка, чтобы понять что тут имел ввиду автор рефлексии игромно. Принесёт ли это баги в dynamic_cast)
Ладно, надо тестировать, спасибо за статью

Шаблоны против статической рефлексии в C++: пять операций, две реализации и дедупликация, которая не стоит памяти