先看一个典型递归问题:斐波那契数列。
#include <iostream>
int get_fi(int n)
{
if(n==1 || n==2)
{
return 1;
}
else
{
return get_fi(n-1) + get_fi(n-2);
}
}
int main()
{
std::cout << get_fi(40) << std::endl;
return 0;
}
递归问题代码一般都是写起来简单易理解,运行起来就很可能时间长的不可接受。
可以使用模板元把运行时消耗的时间在编译期间进行优化。
#include <iostream>
template<int N>
struct item
{
enum {res = item<N-1>::res+item<N-2>::res};
};
template<>
struct item<1>
{
enum {res = 1};
};
template<>
struct item<2>
{
enum {res = 2};
};
int main()
{
std::cout << item<40>::res << std::endl;
return 0;
}
模板元编程有许多优点,也有一些缺点。
优点:
效率:最主要的优点是性能。因为模板元编程在编译时进行计算,避免了运行时的开销。
优化:编译器可以通过查看模板元编程的结果来进行进一步的优化。
泛型编程:模板元编程可以实现类型无关的代码。你可以编写一段代码,并且可以应用到不同的类型上,而无需重复编写这段代码。
缺点:
可读性:模板元编程使代码难以阅读和理解。如果不必要,一般建议避免使用。
编译时间:过多的模板元编程会导致编译时间增加。
错误信息:当模板元编程出错时,错误信息通常很难理解。
兼容性:不同的编译器对模板元编程的支持程度可能不同,可能会影响代码的可移植性。
欢迎交流、