2012-03-02 7 views
3

コンパイル時に、以下の配列をC++のテンプレートを使用して作成できますか?C++でのテンプレートを使用した2sのパワーの配列

INT powerOf2 [] = {1,2,4,8,16,32,64,128,256}

これは私が得た最も近いです。

template <int Y> struct PowerArray{enum { value=2* PowerArray<Y-1>::value };};

が、その後は、私は動的変数であるとして、コンパイラはエラーを与えるPowerArray < i>のようなものが必要に使用します。

+0

ですか? – k06a

+0

変数iは動的です、そうですか? –

+0

C++ 11では、おそらくconstexprが最良の方法です。 –

答えて

3

あなたはこのためにBOOST_PP_ENUMを使用することができます。

#include <iostream> 
#include <cmath> 
#include <boost/preprocessor/repetition/enum.hpp> 

#define ORDER(z, n, text) std::pow(z,n) 

int main() { 
    int const a[] = { BOOST_PP_ENUM(10, ORDER, ~) }; 
    std::size_t const n = sizeof(a)/sizeof(int); 
    for(std::size_t i = 0 ; i != n ; ++i) 
    std::cout << a[i] << "\n"; 
    return 0; 
} 

出力ideone

0

BOOST_PP_ENUMを使用していることは何もありませんが、私はあなたにこの種のコードを紹介します。

私がやることは、あなたが必要とするものだけに配列を設定する型クラスのコンストラクタを作ることです。そうすることで、プログラムが構築されるとすぐにそれが実行され、素敵できれいに保たれます。 AKA正しい方法。

 class Power 
    { 
    public: 
     Power(); 
     void Output(); 
     // Insert other functions here 
    private: 
     int powArray[10]; 
    }; 

次に、作成した配列にロードするための基本的な "forループ"が実装されます。 PowerArray ::値の動的変数は、このことができます

Power::Power() 
{ 
    for(int i=0;i<10;i++){ 
     powArray[i] = pow(2,i); 
    } 
} 
void Power::Output() 
{ 
    for(int i=0;i<10;i++){ 
      cout<<powArray[i]<<endl; 
    } 
} 

希望...

+0

アスカーは実行時関数ではなく静的(コンパイル時)の配列(TMPなど)を要求しています。 –

関連する問題