Это зависит от того, какой шаблон проектирования вас интересует. Есть такие, как «Активный объект» и «Утилизация», которые будут трудно реализовать во время компиляции.
шаблон "интерпретатора" -> boost.ublas и blitz ++ оба используют "шаблоны выражений"
шаблон "bridge" -> Каждый стандартный контейнер принимает аргумент "allocator" (большая часть Loki также является шаблонами bridge)
шаблон "стратегии" -> функции шаблонов STL выбирают наилучшую реализацию на основе типов аргументов
Единственное различие во всем этом заключается в том, что оценка шаблона происходит при запуске компилятора, а не при запуске исполняемого файла. Поэтому все, что вам нужно, это немного изменить мышление: шаблоны - это программа, а «компилятор C ++» запускает и интерпретирует эту программу. Результатом этой шаблонной программы является объектный файл, готовый для компоновки. Другими словами, время выполнения кода вашего шаблона является точным, когда ваш компилятор работает. Шаблоны C ++ представляют собой полноценный функциональный язык, как lisp или XSLT.
На самом деле самая первая шаблонная метапрограмма в 1993 году имела на выходе не исполняемый файл, а серию ошибок компилятора, которые печатали последовательность fibonacii или что-то в этом роде.