模板超编程(英语:Template metaprogramming,缩写:TMP)是一种超编程技术,编译器使用模板产生暂时性的源码,然后再和剩下的源码混合并编译。这些模板的输出包括编译时期常量、数据结构以及完整的函数。如此利用模板可以被想成编译期的运行。这种技术被许多语言使用,最为知名的当属C++,其他还有Curl、D、Eiffel,以及语言扩展,如Template Haskell(英语:Template Haskell)。
使用模板作为元编程的技术需要两阶段的操作。首先,模板必须被定义;第二,定义的模板必须被实体化才行。模板的定义描述了生成源码的一般形式,而使实体化则导致了某些源码的组合根据该模板而生成。
模板元编程是一般性地图灵完全(),这意味着任何可被电算软件表示的运算都可以透过模板超编程以某种形式去运算。
模板与宏()是不同的。所谓宏只不过是以文字的操作及替换来生成代码,虽然同为编译期的语言特色,但宏系统通常其编译期处理流的能力()有限,且对其所依附之语言的语义及类型系统缺乏认知(一个例外是LISP的宏)。
模板元编程没有可变的变量——也就是说,变量一旦初始化后就不能够改动。因此他可以被视为函数式编程()的一种形式。
模板超编程的语法通常与一般的程序语法迥异,他有其实际的用途。一些使用模板超编程的共同理由是为了实现泛型编程()或是展现自动编译期最优化,像是只要在编译期做某些事一次就好,而无需每次程序运行时去做。
以下将展示究竟何谓"编译期程序设计"。阶乘是一个不错的例子,在此之前我们先来回顾一下一般C++中端乘函数的递归写法:
int factorial(int n) { if (n == 0) return 1; return n * factorial(n - 1);}void foo(){ int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24 int y = factorial(0); // == 0! == 1}