欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

模板元编程简介2

程序员文章站 2022-05-21 08:07:09
...

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(v);

}

template

inline double power(double v)

{

return v;

}


上面的模板不够通用,只能针对double类型。下面引用新的类型参数T,由于函数模板不支持偏特化,我们不便直接指定N=1时的结果,因此可以借助于一个类模板。

template

struct Power

{

template

static T value(T x)

{

return x * Power::value(x);

};

template

struct Power

{

template

static T value

{

reurn x;

}


这样,我们求x的4次方,可以这样写:Power::value(x);

但是这样写很不方便,所以我们可以写一个辅助的模板函数,如下:

template

{

inline T Power(T v)

return Power::value(v);

}

这样,x的4次方就可以这样来写:power(x);

}