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];
};
どちらのケースでは、コンパイルのために実際に必要な metaFunction
のconstexpr
属性です。 constexpr
が削除された場合は、 となり、/* MyClass Version 1*/
もC++ 03に適しています。
イニシャライザリストについて:(http://stackoverflow.com/questions/907471/c0x-initializer-list-example) – fileoffset
"手動でアレイを塗りつぶさない"とはどういう意味ですか?また、ここで 'constexpr'は必要ありません。あなたは '_myVar'の寸法を設定していたとします。 – juanchopanza
@juanchopanza:私は質問があると思います:一般的な方法でconstexpr関数を使ってconstexpr配列を埋める方法は? – mirk