web-dev-qa-db-ja.com

クラスにそれ自体の静的constexprメンバーインスタンスを含めることはできませんか?

このコードは不完全なタイプエラーを発生させます。何が問題ですか?クラスに静的メンバーインスタンス自体を含めることはできませんか?同じ結果を達成する方法はありますか?

struct Size
{
    const unsigned int width;
    const unsigned int height;

    static constexpr Size big = { 480, 240 };

    static constexpr Size small = { 210, 170 };

private:

    Size( ) = default;
};
43
nyarlathotep108

同じ結果を達成する方法はありますか?

「同じ結果」によって、constexpr- ness of Size::bigおよびSize::small?その場合、おそらくこれは十分に近いでしょう:

struct Size
{
    const unsigned int width = 0;
    const unsigned int height = 0;

    static constexpr Size big() {
        return Size { 480, 240 };
    }

    static constexpr Size small() {
        return Size { 210, 170 };
    }

private:

    constexpr Size() = default;
    constexpr Size(int w, int h )
    : width(w),height(h){}
};

static_assert(Size::big().width == 480,"");
static_assert(Size::small().height == 170,"");
41
Mike Kinghan

クラスは、同じタイプの静的メンバーを持つことが許可されています。ただし、クラスはその定義の終わりまで不完全であり、オブジェクトは不完全な型で定義できません。不完全な型のオブジェクトを宣言して、後で(クラスの外で)完全な場所で定義できます。

struct Size
{
    const unsigned int width;
    const unsigned int height;

    static const Size big;
    static const Size small;

private:

    Size( ) = default;
};

const Size Size::big = { 480, 240 };
const Size Size::small = { 210, 170 };

こちらをご覧ください: http://coliru.stacked-crooked.com/a/f43395e5d08a3952

ただし、これはconstexprメンバーには機能しません。

60
Brian