我已经在上面的评论中提到了C++模板元编程。因此,让我提供一个使用模板元编程C++简短示例。我知道你用 标记了你的问题,但这可能是有见地的。我希望您能够理解C++代码。java
示例演示:
考虑以下递归函数,它生成斐波那契数列(0, 1, 1, 2, 3, 5, 8, 13, ...):
unsigned int fib(unsigned int n)
{
return n >= 2 ? fib(n-2) + fib(n-1) : n;
}
要从斐波那契数列中获取项目,请调用此函数 - 例如 --,,它将计算该值并将其返回给您。到目前为止没什么特别的。fib(5)
但是现在,在C++您可以使用模板(有点类似于Java中的泛型)重写此代码,以便斐波那契数列不会在运行时生成,而是在编译时生成:
// fib(n) := fib(n-2) + fib(n-1)
template <unsigned int n>
struct fib // <-- this is the generic version fib<n>
{
static const unsigned int value = fib<n-2>::value + fib<n-1>::value;
};
// fib(0) := 0
template <>
struct fib<0> // <-- this overrides the generic fib<n> for n = 0
{
static const unsigned int value = 0;
};
// fib(1) := 1
template <>
struct fib<1> // <-- this overrides the generic fib<n> for n = 1
{
static const unsigned int value = 1;
};
要使用此模板从斐波那契数列中获取项目,只需检索常量值 - 例如.fib<5>::value
结论(“这与元编程有什么关系?”):
在模板示例中,在编译时生成斐波那契级数列的是C++编译器,而不是在程序运行时生成该序列。(从第一个示例中调用函数,而在模板示例中检索常量值的事实中可以明显看出这一点。你得到你的斐波那契数列,而不用写一个函数来计算它们!您没有对该函数进行编程,而是对编译器进行了编程,以为您执行一些并非明确设计用于...这是非常了不起的。
因此,这是元编程的一种形式:
元编程是编写计算机程序,这些程序编写或操作其他程序(或它们自己)作为其数据,或者在编译时执行部分工作,否则将在运行时完成。
--维基百科关于元编程的文章中的定义,强调由我添加。
(还要注意上面模板示例中的副作用:当您使编译器预先计算斐波那契数列时,它们需要存储在某个地方。程序的二进制文件的大小将按比例增加到包含术语 的表达式中使用的最高大小。从好的方面来说,您可以在运行时节省计算时间。n
fib<n>::value