Разработка приложений на C++
  • Введение
  • Особенности разработки программ на С++
    • Указатель на функцию
    • Преобразование типов
    • Наследование
    • Виртуальные функции
    • Перегрузка операций
    • Функциональные объекты
    • Шаблоны
    • Пространства имён
    • Обработка исключительных ситуаций
    • Немного о компиляции и сборке
    • Рекоммендации по написанию кода
    • Новые возможности стандарта С++11
    • Терминология
  • Понятие структур данных
    • Массивы
    • Динамические структуры
  • Метапрограммирование
    • Шаблоны функций
    • Шаблоны классов
    • Специализация шаблонов
      • Пример: вычисление факториала
      • Пример: числа Фиббоначчи
    • Конфигурации шаблонных классов
  • Стандартная библиотека С++
    • Обзор стандартной библиотеки С++
    • Структура стандартной библиотеки С++
      • Концепции
    • Ввод-вывод данных
    • Примитивы, определённые в библиотеке STL
    • Итераторы
    • Контейнеры
      • Inplus: Как это работает
    • Алгоритмы
      • inplus: Как это работает
    • Примеры использования стандартной библиотеки С++
    • Стандартная библиотека С++/Вопросы
    • Стандартная библиотека С++/Примеры лабораторных работ
  • Разработка и использование библиотек программирования
    • Создание библиотек программирования
    • Использование динамических библиотек
    • Вопросы
    • Примеры лабораторных работ
  • Ответы на вопросы
Powered by GitBook
On this page
  1. Метапрограммирование
  2. Специализация шаблонов

Пример: вычисление факториала

Задача: Вычислить произведение чисел от 1 до N во время компилляции.

Решение этой задачи сводится к факту, что каждое последующее значение зависит от предыдущего: P(N) = N * P(N-1). Исключение составляет только начальное значение, то есть для N = 1 => P(N) = 1. Шаблоны позволяют реализовать рекурсивное инстанциирование (определение) типов при помощи специализации шаблонов.

При помощи шаблонов задача решается следующим образом (tpl_product.cpp):

tpl_factorial.cpp
#include <iostream>

template<size_t value>
struct factorial {
	enum {
		RESULT = value * factorial<value - 1>::RESULT
	};
};

template<>
struct factorial<0> {
	enum { RESULT = 1 };
};

int main() {
	std::cout << "factorial = " << factorial<10>::RESULT;
	return 0;
}

Использование рекурсии в шаблонах ограничено, так как компилятор при специализации опускается до определенного уровня (зависит от настроек компилятора). Таким образом, произведение 100 первых чисел вычислить уже не удасться.

PreviousСпециализация шаблоновNextПример: числа Фиббоначчи

Last updated 1 year ago