以下程序计算2加权到幂n而不使用任何循环,运行时递归或库函数[pow]。
它使用 TEMPLATE METAPROGRAMMING 技术。
#include <iostream>
using namespace std;
template<int n> struct funStruct
{
enum { val = 2*funStruct<n-1>::val };
};
template<> struct funStruct<0>
{
enum { val = 1 };
};
int main()
{
cout << funStruct<8>::val << endl;
return 0;
}
我在游荡,我可以用功能代替结构吗?
答案 0 :(得分:6)
@tdammes指出的显而易见的解决方案只是一种非迭代的非递归方法:
constexpr int pow2( unsigned pwr ) {
return 1 << per;
}
通过使用constexpr
,编译器将在编译时计算结果并产生编译时常量。如果您仍想使用递归,您可以:
constexpr int pow2( unsigned pwr ) {
return pwr==0? 1 : 2*pow2(pwr-1);
}
与您的元编程技巧基本相同的编译时间递归以稍微简洁易读的方式。当然,使用constexpr
需要C ++ 11,所以如果你没有它,你总是可以使用原始的元编程技巧,或者@tdammers方法适应:
template <unsigned int N>
struct pow2 {
static const unsigned int value = 1 << N;
};
答案 1 :(得分:4)
这是一种显而易见的解决方案:
unsigned int power_of_two(unsigned int power) {
return (1 << power);
}
你可以支持有符号的权力,但这在整数数学中毫无意义,因为2的所有负幂都小于1并且会截断为0。