编译期计算的好处人人皆知,但是实现一些复杂的运算还是需要一点技巧的。总结来说,如果计算能够写成迭代的形式,即f(n) = f(n-1) op N, 其中op为某种常规运算操作符,N为编译期常数,而且操作数皆为整数(C++暂不支持浮点数作为模板参数),则可以利用模板类(template class)的技术来实现编译期计算。

下面是两个实例:

1、计算x^y乘方运算

template<int X, int Y>
class Pow
{
public:
    enum { value = Pow<X, Y-1>::value * X };
};

template<int X>
class Pow<X, 1>
{
public:
    enum { value = 1 };
};

// 举例:计算2^6=64
x = Pow<2, 6>::value;

2、计算以2为底的对数log2(N)

template<int N>
class Log2
{
public:
    enum { value = Log2<N/2>::value + 1 };
};

template<>
class Log2<1>
{
public:
    enum { value = 0 };
};

// 举例:计算log2(64) = 6
x = Log2<64>::value;

若N不是2的整数次方,无法计算出正确结果,因为枚举常量不可以为浮点值。所以只能显示取整后的值。

如果C++能够支持浮点数作为模板参数,则该技术的应用性会大大加强,不知道是什么历史原因导致了这种不支持?求指教……

» 转载请注明来源及链接:未来代码研究所

Related Posts:

Leave a Reply

World Line
Time Machine
Friendly Links
Online Tools