так что эта метапрограмма быстрее ... из-за константного литерала.
НО: где в реальном мире у нас есть постоянные литералы?
Большинство программ, которые я использую, реагируют на ввод пользователя.
Вот почему он почти никогда не используется для значений. Обычно он используется на типах. использование типов для вычисления и генерации новых типов.
Существует множество реальных применений, с некоторыми из которых вы уже знакомы, даже если не понимаете этого.
Один из моих любимых примеров - итераторы. Да, в основном они разработаны с использованием общего программирования, но метапрограммирование шаблонов полезно, в частности, в одном месте:
Для исправления указателей, чтобы их можно было использовать в качестве итераторов. Итератор должен предоставить несколько типов typedef, таких как value_type
. Указатели этого не делают.
Таким образом, код, подобный следующему (в основном идентичен тому, что вы найдете в Boost.Iterator)
template <typename T>
struct value_type {
typedef typename T::value_type type;
};
template <typename T>
struct value_type<T*> {
typedef T type;
};
- это очень простая шаблонная метапрограмма, но она очень полезна. Это позволяет вам получить тип значения любого типа итератора T, будь то указатель или класс, просто с помощью value_type<T>::type
.
И я думаю, что вышесказанное имеет некоторые очень очевидные преимущества, когда дело доходит до ремонтопригодности. Ваш алгоритм, работающий на итераторах, должен быть реализован только один раз. Без этого трюка вам пришлось бы сделать одну реализацию для указателей, а другую для «правильных» итераторов на основе классов.
Трюки типа boost::enable_if
тоже могут быть очень ценными. У вас перегружена функция, которая должна быть включена только для определенного набора типов. Вместо определения перегрузки для каждого типа вы можете использовать метапрограммирование, чтобы указать условие и передать его в enable_if
.
Earwicker уже упомянул еще один хороший пример - структуру для выражения физических единиц и измерений. Это позволяет вам выражать вычисления, как с физическими единицами, и обеспечивает тип результата. Умножение метров на метры дает количество квадратных метров. Шаблон метапрограммирования можно использовать для автоматического получения нужного типа.
Но в большинстве случаев метапрограммирование шаблонов используется (и полезно) в небольших, изолированных случаях, в основном для сглаживания неровностей и исключительных случаев, чтобы набор типов выглядел и вел себя единообразно, позволяя вам более широко использовать общее программирование эффективно