7

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));
}

配列を手動で埋めずに myVar を constexpr で初期化する方法はありますか? そして、それが存在する場合、与えられた例の構文は何ですか?

質問を少し正確にするために、1 回の関数呼び出しを使用して myVar のすべての値を埋める方法を探します。

4

1 に答える 1

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これは、静的メンバーではないと思う傾向がありますが、なぜこの整数定数の配列が静的でないのかはわかりません。その場合は、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属性はmetaFunction実際にはコンパイルに必要ではありません。constexprが削除された場合は/* MyClass Version 1*/、C++03 にも適しています。

于 2012-05-11T07:59:42.677 に答える