模板元编程简介2
2:求解一个数的乘方。 当然这个可以利用cmath头文件中pow函数来完成,但对于次数较小的常整数的乘方运算来说,这种办法的效率较低,不如手工写一个操作数连乘的表达式,但有时候这样并不方便,特别当乘方运算的底数本身是一个较为复杂的表达式时,一般还要
2:求解一个数的乘方。
当然这个可以利用cmath头文件中pow函数来完成,但对于次数较小的常整数的乘方运算来说,这种办法的效率较低,不如手工写一个操作数连乘的表达式,但有时候这样并不方便,特别当乘方运算的底数本身是一个较为复杂的表达式时,一般还要先用临时变量将表达式保存,再对临时变量做乘方。通过定义一个如下的内联函数可以提供一些方便。
inline double power(double x, unsigned n)
{
double result = x;
for(int i = 1; i
result *= x;
return result;
}
当n比较小时,这个函数的效率通常会比cmath头文件的pow函数高,但这要在运行时执行循环,并没有达到理想的效率,模板元又派上用场了。如下:
template
inline double power(double v)
{
return v * power
}
template
inline double power(double v)
{
return v;
}
上面的模板不够通用,只能针对double类型。下面引用新的类型参数T,由于函数模板不支持偏特化,我们不便直接指定N=1时的结果,因此可以借助于一个类模板。
template
struct Power
{
template
static T value(T x)
{
return x * Power
};
template
struct Power
{
template
static T value
{
reurn x;
}
这样,我们求x的4次方,可以这样写:Power::value(x);
但是这样写很不方便,所以我们可以写一个辅助的模板函数,如下:
template
{
inline T Power(T v)
return Power
}
这样,x的4次方就可以这样来写:power(x);
}