Comments 5
Да уж, глубина глубин... А ведь вы еще даже метапрограммирование на шаблонах не затронули! И самое главное - как удалось породить такое из простой, естественной и очевидной идеи параметризировать классы и функции на этапе компиляции по типу макросов. Универсальный, не зависящий от типа данных код для классов массивов, списков, алгоритмов поиска и сортировки и т.п.... Просто и естественно. И вот во что это вылилось.
Ну так и используйте только для этого. Никто вас не заставляет ни вариадики, ни parameter pack и тд использовать.
посмотрите на машину тьюринга. Шаг влево, шаг вправо, условие перехода, останова — и ВНЕЗАПНО простая система полна по тьюрингу, можно выразить почти что угодно, хотя описать её — проще чем описать молоток!
Шаблоны это просто, естественно и функционально. Замечательно же! :) То что на sed
можно написать тетрис — никто не заставляет писать вас тетрис, используйте sed для того чтобы заменить слово в строке.
Вот только не надо приплетать сюда политику. Статья хорошая и интересная. Метапрограммирование это тема отдельной статьи и не всем это надо. Примеры хорошие прикладные, и не заезженная тема статьи. Мне понравилось!
Класс, я бы хотел добавить еще два пункта:
Частичная специализация доступна для шаблонных классов, но не для функций. Это супер не очевидно и вызывает боль при попытке разобраться в первый раз
template <class A, class B>
void foo(); // шаблонная функция
foo<int, int>() // можно
foo<int>() // нельзя
Возвращаемый тип не участвует в дедукции типов. Только параметры участвуют
template <class A, class B>
A foo(B value);
int foo(int value); // нельзя, частичная специализация, хотя казалось бы
Восемь неочевидных вещей в шаблонах С++