没有看到
MyClass
的定义,问题还不够清晰。我认为你想要初始化
MyClass::_myVar
,而不是用迭代的方式填充它,这是正确的吧。
你的代码表明
MyClass::_myVar
是一个静态类成员。在这种情况下,你对成员的初始化是符合 C++11 标准的。以下程序演示了这一点(GCC 4.6.3):
#include <iostream>
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
不是静态成员——尽管我不确定为什么这个整数常量数组不是静态的。如果是这样的话,那么你可以使用C++11的
统一初始化特性在默认构造函数中初始化该成员:
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 也是可行的。
constexpr
。如果您正在设置_myVar
的维度,则需要使用它。 - juanchopanzaBOOST_PP_ENUM
:-) - Andreas Spindler