Метапрограммирование шаблонов в C++
Метапрограммирование шаблонов в C++
В разрабатываемых в отделе библиотеках применяются многие технологии разработки ПО. Одной из них является метапрограммирование шаблонов. Шаблоны применяются в рамкам таких методик программирования, как, например, обобщенное программирование, библиотеки шаблонных выражений, шаблонное метапрограммирование, и т. д. В общем, метапрограммированием называется вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы, либо программ, которые изменяют себя на стадии выполнения [2]. Метапрограммирование шаблонов в C++ (Template metaprogramming (TMP)) — это процесс разработки программы с использованием шаблонов, выполнение которой происходит во время компиляции. Было доказано, что технология TMP является тьюринг-полной, то есть способна выполнять любые вычисления. Преимуществами технологии TMP являются возможность перенести некоторые вычисления со стадии исполнения на стадию компиляции, что позволяет раньше обнаруживать ошибки, и повысить эффективность работы программы. Но ввиду того, что часть работы переносится на стадию компиляции, то эта стадия может занять гораздо больше времени.
- Следующий пример демонстрирует некоторые возможности TMP, в частности то, как реализуются переменные, циклы и ветвления на примере вычисления факториала [1, 3]:
-
- template<unsigned int n>
- struct Factorial {
- enum {value = n * Factorial<n - 1>::value};
- };
-
- template<>
- struct Factorial<0> {
- enum {value = 1};
- };
-
- int main(int argc, char** argv)
- {
- std::cout << Factorial<5>::value << std::endl;
- return 0;
- }
-
- Результатом работы этой программы будет вычисление факториала. В TMP циклы моделируются с помощью рекурсии, но используются не рекурсивные вызовы функции, а рекурсивная конкретизация шаблонов. Как видно из примера, рекурсия возникает когда конкретизации шаблона Factorial<n> ссылается на конкретизацию шаблона Factorial<n-1>. С помощью специализации шаблона Factorial<0> осуществляется прекращение рекурсии. Таким образом, каждая конкретизация шаблона Factorial является структурой в которой для объявления переменной value, хранящей значение факториала используется перечисление.
- Несмотря на все плюсы использования технологии TMP, существует и достаточно минусов, например: неочевидный синтаксис применяемый в ней, неразвитый инструментарий, и т. д. По всей видимости, технология TMP не станет основным инструментом разработки, но для некоторых программистов, в особенности разрабатывающих библиотеки, эта технология вероятно сможет занять важное место.
- [1] (S. Meyers «Effective C++, Third Edition: 55 Specific Ways to Improve Your Programs and Designs » 2005 Pearson Education, Inc. ISBN: 0-321-33487-6 Pp.233-238)
- [2] http://ru.wikipedia.org/wiki/Метапрограммирование
- [3] http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm