模板元编程简介2

来源:互联网 发布:淘宝网斜挂包包 编辑:程序博客网 时间:2024/04/30 09:10

2:求解一个数的乘方。

当然这个可以利用cmath头文件中pow函数来完成,但对于次数较小的常整数的乘方运算来说,这种办法的效率较低,不如手工写一个操作数连乘的表达式,但有时候这样并不方便,特别当乘方运算的底数本身是一个较为复杂的表达式时,一般还要先用临时变量将表达式保存,再对临时变量做乘方。通过定义一个如下的内联函数可以提供一些方便。


inline double power(double x, unsigned n)

{

double result = x;

for(int i = 1; i < n; i ++)

result *= x;

return result;

}

当n比较小时,这个函数的效率通常会比cmath头文件的pow函数高,但这要在运行时执行循环,并没有达到理想的效率,模板元又派上用场了。如下:

template<unsigned N>

inline double power(double v)

{

return v * power<N - 1>(v);

}

template<>

inline double power<1>(double v)

{

return v;

}


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

template<unsigned N>

struct Power

{

template<class T>

static T value(T x)

{

return x * Power<N - 1>::value(x);

};

template<>

struct Power<1>

{

template<class T>

static T value<T x>

{

reurn x;

}


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

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

template<unsigned N, class T>

{

inline T Power(T v)

return Power<N>::value(v);

}

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

}

原创粉丝点击