tgoop.com/seniorcpp/2843
Last Update:
Немного про метапрограммирование и эстетическое удовольствие от type_traits
Сегодня прочитал пост Вани Ходора (бэкенд-разраб из Лавки) про type traits — небольшой гайд, который наверняка вызовет ностальгию у тех, кто когда-то лепил свои std::enable_if, is_same, remove_cvref, потому что библиотека ещё была до C++14 и приходилось всё тащить на себе.
Казалось бы, type_traits — довольно скучная часть стандартной библиотеки. Но чем больше работаешь с шаблонным кодом, тем чаще ловишь себя на том, что это не просто утилиты, а строительные блоки для архитектуры. И да, некоторые из них прямо эстетически красивые.
Из любимого — std::is_invocable, std::is_detected, std::conditional_t, std::void_t. Когда видишь, как эти трейты могут элегантно разрулить перегрузку, или сделать fallback на дефолтную реализацию без лишних ифов — это как хорошо написанная лямбда: вроде ничего особенного, а работает идеально.
Интересно, что в посте Ваня делает именно то, чего часто не хватает в серьезных разборках: он просто делится тем, что ему нравится. Это похоже на разговор с коллегой на кухне, когда ты не лекцию читаешь, а делишься любимыми инструментами.
В целом, type_traits — это, по сути, DSL на минималках. Если подходить к ним не как к синтаксическому сахару, а как к способу выразить правила типов прямо в коде — открывается совсем другой уровень выразительности. Особенно если ты пишешь свои обёртки, декораторы или generic-компоненты.
👴 Помню времена, когда std::enable_if приходилось объяснять джунам с доской и маркером. Сейчас это уже почти common sense. И это хорошо — потому что без этой базы метапрограммировать тяжело.
В общем, рекомендую почитать — вдруг тоже вспомните свои любимые трейты. А если нет — повод попробовать std::is_aggregate или std::is_trivially_copyable и посмотреть, как они могут облегчить жизнь.
Кстати, а у вас в команде кто-нибудь ещё пишет свои трейты или все уже перешли на концепты?
BY Senior C++ Developer
Share with your friend now:
tgoop.com/seniorcpp/2843