Концептуальные требования

Шаблоны и построенное на них метопрограммирование являются одним из мощнейших инструментов, доступных C++-программисту. К сожалению, доступность метопрограммирования на всём протяжении жизни C++ определялась не столько тем, что позволяет сделать язык, сколько тем, что конкретный программист на C++ способен выжать из него. Потому что даже С++98 позволял уже очень многое, а с добавлением variadic templates и expression SFINAE в C++11 C++ обрёл, наверное, все необходимые инструменты метапрограммирования. Но проблема того, что им могут заниматься только избранные индивиды, никуда с C++11 не ушла. Надо сказать, что не ушла она и поныне, но практически в каждой итерации языка мы получали что-то, что позволяло его упростить, сделать метапрограммирование более понятным и доступным рядовому C++-программисту. Одной из наиболее важных вех на этом пути стал стандарт C++20, в котором появились долгожданные ограничения параметров шаблона (англ. constraints), и именно о них пойдёт речь в настоящей статье. [Ещё]

SFINAE. Как много в этом слове

Одной из наиболее сложных для понимания функциональностей в C++, по праву считаются шаблоны. Нет, не их простейшее применение — здесь, как правило, у людей не возникает больших проблем. Проблемы возникают тогда, когда с использованием шаблонов начинают писать код, который порождает другой код, т.е. писать код на языке шаблонов — это называется метапрограммирование. Многие люди, увидев подобный код, впадают в состояние транса — тут ещё хуже чем с указателями, если указатели не все понимают, то с шаблонами дело обстоит ещё хуже. [Ещё]