2上升到幂n没有任何循环或递归或库函数

Gre*_*lin -4 c++ templates

下面的程序计算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;
}
Run Code Online (Sandbox Code Playgroud)

我在游荡,我可以用功能代替结构吗?

Dav*_*eas 6

正如@tdammes所指出的那样,显而易见的解决方案只是一种非迭代的非递归方法:

constexpr int pow2( unsigned pwr ) {
   return 1 << per;
}
Run Code Online (Sandbox Code Playgroud)

通过使用constexpr编译器将在编译时计算结果并产生编译时常量.如果您仍想使用递归,您可以:

constexpr int pow2( unsigned pwr ) {
   return pwr==0? 1 : 2*pow2(pwr-1);
}
Run Code Online (Sandbox Code Playgroud)

与您的元编程技巧基本相同,编译时间递归与稍微简洁易读的方式相同.constexpr当然,使用C++ 11,所以如果你没有它,你总是可以使用原始的元编程技巧,或者@tdammers方法适用:

template <unsigned int N>
struct pow2 {
   static const unsigned int value = 1 << N;
};
Run Code Online (Sandbox Code Playgroud)