Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
774.38 Кб
Скачать

Вычисления типов

Основное направление метапрограммирования – работа с типами.

С использованием шаблонов С++ можно писать читабельный код, без задействования механизмов наподобии синтаксического анализатора выражений YACC.

expr =

( term[expr.val = _1] >> '+' >> expr[expr.val += _1] )

| ( term[expr.val = _1] >> '-' >> expr[expr.val -= _1] )

| term[expr.val = _1]

;

term =

( factor[term.val = _1] >> '*' >> term[term.val *= _1] )

| ( factor[term.val = _1] >> '/' >> term[term.val /= _1] )

| factor[term.val = _1]

;

factor =

integer[factor.val = _1]

| ( '(' >> expr[factor.val = _1] >> ')' )

;

Преимущества мета подхода:

Использование YACC-подобных систем – снижает производительность, т.к. двоичный файл делает свою работу во время компиляции, его значение доступно как постоянное время компиляции, и компилятор может закодировать его непосредственно в объектном коде.

Более тонкий, но возможно более важный аргумент в пользу метапрограмм - то, что результат вычисления может взаимодействовать более глубоко с выходным языком. Например, размер массива C++ может быть определен только на этапе компиляции с помощью константы наподобии <N>::value и метапрограмма позволяет работать с этим размером на этапе компиляции, чего невозможно добиться на этапе выполнения, при использовании переменных значений.

Грамматика YACC может содержать произвольный код C/C++, который будет выполняться как часть сгенерированного синтаксического анализатора - это возможно благодаря тому, что действия обработаны во время компиляции грамматики и переданы целевому компилятору C/C++.

Второй аргумент – удобочитаемость кода метапрограмм С++ с использованием шаблонов гораздо выше аналогичных YACC-подобных кодов.

Почему Метапрограммирование C++:

На языке, таком как C++, где доменный язык - только подмножество языка, используемого в остальной части программы, метапрограммирование еще более мощно и удобно.

Пользователь может ввести доменный язык непосредственно, не изучая внешний синтаксис или прерывая поток кода.

Взаимодействие через интерфейс с метапрограммами с другим кодом, особенно другими метапрограммами, становится намного более гладким.

Когда использовать метапрограммирование:

Научные расчеты:

  • Нужны быстрые и оптимизированные расчеты; с использованием арифметики работы с массивами, используя нотацию оператора на матричных и векторных объектах, а не как циклы по последовательностям чисел.

Архитектура приложения:

  • Выражения кода с точки зрения абстракций предметной области.

Безопасность:

  • Вы хотите использовать ценные свойства универсального программирования в C++, такие как статическая проверка типа и поведенческая настройка без снижения эффективности.

  • Вы хотите сделать все это в пределах языка C++ без внешнего инструмента или пользовательского генератора исходного кода.

Польза использования mpl:

  • Качество. Шблонные метакомпоненты более универсальны, следовательно пишется меньше кода для поддержки большего количества решений. Меньше кода – меньше ошибок, более быстрая скорость исправления ошибок, внесения изменений. Нет необходимости в повторении одного и того же кода интерфейса для реализации различных типов.

  • Повторное использование. Все библиотеки инкапсулируют код в допускающих повторное использование компонентов. Что еще более важно хорошо разработанная универсальная библиотека устанавливает платформу понятий и идиом, который обеспечивает допускающую повторное использование умственную модель для приближающихся проблем. Так же, как STL предоставляет абстракцию итератора и функтора, MPL обеспечивает тип iterators и метафункциональный протокол.

  • Производительность. Код этапа компиляции более оптимизированный – более эффективно выполняется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]