-4

以下のプログラムは、ループ、ランタイム再帰、またはライブラリ関数 [pow] を使用せずに、2 の n 乗を計算します。
これは、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;
}

構造の代わりに関数を使用できるかどうかをさまよっていましたか?

4

2 に答える 2

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;
};
于 2012-06-15T11:35:13.950 に答える
4

これは一種の明白な解決策です:

unsigned int power_of_two(unsigned int power) {
    return (1 << power);
}

符号付き累乗をサポートできますが、2 の負の累乗はすべて 1 未満であり、0 に切り捨てられるため、整数演算では意味がありません。

于 2012-06-15T11:28:06.310 に答える