Templates and generic programming
T.121
Используйте метапрограммирование шаблонов главным образом для эмуляции концептов
Причина
Там, где C++20 недоступен, нам нужно эмулировать концепты с помощью TMP. Случаи использования, требующие концептов (например, перегрузка на основе концептов), входят в число наиболее распространённых (и простых) применений TMP.
Пример
template<typename Iter>
/*requires*/ enable_if<random_access_iterator<Iter>, void>
advance(Iter p, int n) { p += n; }
template<typename Iter>
/*requires*/ enable_if<forward_iterator<Iter>, void>
advance(Iter p, int n) { assert(n >= 0); while (n--) ++p;}
Примечание
Такой код значительно проще с использованием концептов:
void advance(random_access_iterator auto p, int n) { p += n; }
void advance(forward_iterator auto p, int n) { assert(n >= 0); while (n--) ++p;}
Контроль
???