我想知道是否可以使用constexpr函数初始化整个数组(使用C ++ 2011)。 在这里,我有一些东西可以说明我想要做的事情:
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 :(得分:3)
没有看到MyClass
的定义,问题就不那么清楚了。
我相信无论如何你想要MyClass::_myVar
初始化
代码以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];
};
在任何情况下都不是constexpr
的{{1}}属性
编译所必需的。如果metaFunction
被移除
然后constexpr
对C ++ 03也有好处。