用constexpr初始化数组? 我想知道是否可以用一个CistExPR函数初始化一个完整的数组(用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)); } template const unsigned int MyClass::u myVar[2][3]={ {元函数(0,0,DIM),元函数(0,1,DIM),元函数(0,2,DIM)}, {元函数(1,0,DIM),元函数(1,1,DIM),元函数(1,2,DIM)} }; 模板内联constexpr unsigned int MyClass::元函数(const unsigned int k,const unsigned int n,const unsigned int dim) { 返回((n
没有看到用constexpr初始化数组? 我想知道是否可以用一个CistExPR函数初始化一个完整的数组(用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)); } template const unsigned int MyClass::u myVar[2][3]={ {元函数(0,0,DIM),元函数(0,1,DIM),元函数(0,2,DIM)}, {元函数(1,0,DIM),元函数(1,1,DIM),元函数(1,2,DIM)} }; 模板内联constexpr unsigned int MyClass::元函数(const unsigned int k,const unsigned int n,const unsigned int dim) { 返回((n,c++,arrays,c++11,constexpr,C++,Arrays,C++11,Constexpr,没有看到MyClass的定义,问题不太清楚。 无论如何,我相信您希望在不使用 用MyClass::metaFunction()值迭代填充它的代码 您的代码建议MyClass::\u myVar是一个静态类成员 在这种情况下,您对成员的初始化是非常好的C++11。 以下程序说明了(GCC 4.6.3): 在这两种情况下,metaFunction的constepr属性实际上都不是 编译所必需。如果删除了constexpr 那么,/*MyClass版本1*/也适用于C++03。初始化列表如何:()“不
MyClass
的定义,问题不太清楚。
无论如何,我相信您希望在不使用
用MyClass::metaFunction()
值迭代填充它的代码
您的代码建议MyClass::\u myVar
是一个静态类成员
在这种情况下,您对成员的初始化是非常好的C++11。
以下程序说明了(GCC 4.6.3):
在这两种情况下,metaFunction
的constepr
属性实际上都不是
编译所必需。如果删除了constexpr
那么,
/*MyClass版本1*/
也适用于C++03。初始化列表如何:()“不手动填充数组”是什么意思?此外,这里不需要constexpr
。如果您正在设置\u myVar
@juanchopanza的维度,您会这样做的:我认为问题是:如何以通用方式使用constexpr函数填充constexpr数组?我很好,基于模板的解决方案已经存在。不过,这取决于c语言的模板递归深度ompiler。如果达到限制,请使用,尤其是:-)
#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 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];
};