2012-05-10 42 views
7

constexpr関数(C++ 2011)を使用して配列全体を初期化できるかどうか疑問です。 ここで私は私が何をしたいのか説明するために何かを持っている:constexprで配列を初期化する?

template<unsigned int DIM> const unsigned int MyClass<DIM>::_myVar[2][3] = { 
{metaFunction(0, 0, DIM), metaFunction(0, 1, DIM), metaFunction(0, 2, DIM)}, 
{metaFunction(1, 0, DIM), metaFunction(1, 1, DIM), metaFunction(1, 2, DIM)} 
}; 

template<unsigned int DIM> inline constexpr unsigned int MyClass<DIM>::metaFunction(const unsigned int k, const unsigned int n, const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

は、手動で配列を埋めることなく、constexprのでmyVarを初期化する方法はあります。それが存在する場合、与えられた例の構文は何でしょうか?

質問を正確にするために、私は単一の関数呼び出しを使用してmyVarのすべての値を埋める方法を探します。

+0

イニシャライザリストについて:(http://stackoverflow.com/questions/907471/c0x-initializer-list-example) – fileoffset

+2

"手動でアレイを塗りつぶさない"とはどういう意味ですか?また、ここで 'constexpr'は必要ありません。あなたは '_myVar'の寸法を設定していたとします。 – juanchopanza

+0

@juanchopanza:私は質問があると思います:一般的な方法でconstexpr関数を使ってconstexpr配列を埋める方法は? – mirk

答えて

3

MyClassの定義を見ることなく、この問題は明確ではありません。 私はとにかく、を コードなしで初期化して、MyClass::metaFunction()の値を反復して入力したいと考えています。

MyClass::_myVarは、静的なクラスメンバーであることを示唆しています。その場合、 の場合、メンバの初期化は完全に良好ですC++ 11それはそのままです。 次のプログラムは、(GCC 4.6.3)を示しています。

#include <iostream> 

/* MyClass Version 1 */ 
template<unsigned int DIM> 
struct MyClass 
{ 
    static constexpr unsigned int metaFunction(
     const unsigned int k, 
     const unsigned int n, 
     const unsigned int dim); 

    static const unsigned int _myVar[2][3]; 
}; 

template<unsigned int DIM> inline constexpr 
unsigned int MyClass<DIM>::metaFunction(
    const unsigned int k, 
    const unsigned int n, 
    const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

template<unsigned int DIM> const unsigned int MyClass<DIM>::_myVar[2][3] = { 
    { metaFunction(0, 0, DIM), 
     metaFunction(0, 1, DIM), 
     metaFunction(0, 2, DIM) 
    }, 
    { metaFunction(1, 0, DIM), 
     metaFunction(1, 1, DIM), 
     metaFunction(1, 2, DIM) 
    } 
}; 

template<unsigned int DIM> inline constexpr 
unsigned int MyClass<DIM>::metaFunction(
    const unsigned int k, 
    const unsigned int n, 
    const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

using namespace std; 

int main(void) 
{ 
    MyClass<3> mine; 
    for (int i = 0; i < 2; ++i) { 
     for (int j = 0; j < 3; ++j) { 
      cout << mine._myVar[i][j] << endl; 
     } 
    } 
    return 0; 
} 

これはMyClass::_myVar静的メンバーではないと思われるように私に傾く - 整数定数のこの配列は、静的ではないでしょう、なぜ私はわからないが、 。 その場合は、その後、あなたはuniform initialization provision of C++11を使用して、デフォルト コンストラクタでメンバを初期化することができます。

/* MyClass Version 2 */ 
template<unsigned int DIM> 
struct MyClass 
{ 
    MyClass() 
    : _myVar{ 
      { MyClass::metaFunction(0, 0, DIM), 
       MyClass::metaFunction(0, 1, DIM), 
       MyClass::metaFunction(0, 2, DIM) 
      }, 
      { MyClass::metaFunction(1, 0, DIM), 
       MyClass::metaFunction(1, 1, DIM), 
       MyClass::metaFunction(1, 2, DIM) 
      } 
    }{} 

    static constexpr unsigned int metaFunction(
     const unsigned int k, 
     const unsigned int n, 
     const unsigned int dim); 

    const unsigned int _myVar[2][3]; 
}; 

どちらのケースでは、コンパイルのために実際に必要な metaFunctionconstexpr属性です。 constexprが削除された場合は、 となり、/* MyClass Version 1*/もC++ 03に適しています。