用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];
};