Namespaces
Variants

std::meta::data_member_spec

ja.cppreference.net から
< cpp | meta
 
 
 
リフレクションライブラリ
 
リフレクション型とクエリ
リフレクションクエリ
リフレクションレイアウトクエリ
型プロパティ
型プロパティクエリ
 
ヘッダで定義 <meta>
consteval std::meta::info
    data_member_spec( std::meta::info type, std::meta::data_member_options options );
(1) (C++26 以上)
struct data_member_options
{
    std::optional</*name-type*/> name;
    std::optional<int> alignment;
    std::optional<int> bit_width;
    bool no_unique_address = false;
    std::vector<std::meta::info> annotations;
};
(2) (C++26 以上)
1) データメンバ記述のリフレクションを返します。これは、std::meta::define_aggregate を使用してクラスのデータメンバとして具体化できます。
2) パラメータ型 data_member_options は 集成体型 です。構造体型 ではなく、この型のオブジェクトはコンパイル時にのみ使用できます。

データメンバ記述 は通常、6要素タプル (T, N, A, W, NUA, ANN) として表されます。ここで:

  • T は std::meta::dealias(type) で表される型です。
  • N は options.name によってエンコードされた識別子、またはoptions.name が値を含まない場合の特別な値(⊥)のいずれかです。
  • A は options.alignment が保持するアライメント値、またはoptions.alignment が値を含まない場合の特別な値(⊥)のいずれかです。
  • W は options.bit_width が保持する値、またはoptions.bit_width が値を含まない場合の特別な値(⊥)です。
  • NUA は options.no_unique_address の値です。
  • ANN は、std::meta::constant_of(r) 内の各 r に対する値 options.annotations のシーケンスです。

2つのデータメンバ記述は、それぞれの構成要素が同じエンティティである、同じ識別子である、等しい値を持つ、または両方とも⊥である場合に等しくなります。データメンバ記述の2つのリフレクションは、それらが表す記述が等しい場合に等しいと比較されます。

引数の組み合わせが無効な場合、std::meta::exception が送出されます。詳細については、例外 のセクションを参照してください。

/*name-type*/ によって指定される説明専用の型は、以下のコンストラクタを持つクラス型です。

std::meta::data_member_options::name-type::name-type

template< class T >
    requires std::constructible_from<std::u8string, T>
consteval /*name-type*/( T&& value );
(1)
template< class T >
    requires std::constructible_from<std::string, T>
consteval /*name-type*/( T&& value );
(2)
1) UTF-8文字列 std::u8string(std::forward<T>(value)) から名前を構築します。
2) 通常のリテラルエンコーディングの文字列 std::string(std::forward<T>(value)) から名前を構築します。

パラメータ

型 - 定義するデータメンバの型
options - 定義するデータメンバのその他の機能

戻り値

引数から構築された、データメンバ記述を表すリフレクション。

例外

以下の条件がすべて満たされない限り、std::meta::exception を送出します。

  • std::meta::dealias(type) はオブジェクト型または参照型を表します。
  • もし options.name が値を含む場合:
  • 名前がUTF-8文字列から構築された場合、その文字列は有効なトークンのスペルであり、UTF-8で解釈したときに有効な識別子である。
  • そうでない場合(名前が通常の文字列から構築された場合)、その文字列は有効なトークンのスペルであり、通常のリテラルエンコーディングで解釈したときに有効な識別子である。
  • もし options.name が値を含まない場合、options.bit_width は値を含みます。(この場合、結果は無名ビットフィールドを記述します。)
  • もし options.bit_width が値 V を含む場合:
  • std::meta::is_integral(type) || std::meta::is_enum_type(type) は真です。
  • options.alignment は値を含みます。
  • options.no_unique_address は偽です。
  • V は負ではありません。
  • もし V がゼロの場合、options.name は値を含みません。
  • もし options.alignment が値を含む場合、それは有効なアライメント値であり、std::meta::alignment_of(type) より小さくありません。
  • 各要素 r に対して、options.annotations の各要素は有効であり、非配列オブジェクト型を表し、std::meta::type_of(r) の評価は例外を投げません。std::meta::constant_of(r)

例

#include <format>
#include <meta>
#include <print>
#include <string>

// Defines struct A as if by “struct A { std::string x; };”
struct A;
consteval
{
    std::meta::define_aggregate(^^A,
        {
            std::meta::data_member_spec(^^std::string, {.name = "x"}),
        });
}

// Defines a simple tuple type
template<typename... Ts>
struct Tuple
{
    struct Storage;
    consteval
    {
        std::vector<std::meta::info> member_specs;
        template for (int i{}; auto type : {^^Ts...})
        {
            member_specs.push_back(data_member_spec(type, {.name = std::format("item{}", i)}));
            ++i;
        }

        define_aggregate(^^Storage, member_specs);
    }

    Storage data;

    Tuple(): data{} {}
    Tuple(const Ts& ...values): data{values...} {}
};

int main()
{
    A a;
    a.x = "Hello";

    Tuple<char, char, char, int> t('C', '+', '+', 26);

    std::println("{}, {}{}{}{}!", a.x, t.data.item0, t.data.item1, t.data.item2, t.data.item3);
}

出力:

Hello, C++26!

関連項目

リフレクションがデータメンバ記述を表すかどうかをチェックします
(関数)
データメンバ記述のシーケンスから集成体型を定義します
(関数テンプレート)