std::meta::data_member_spec
ja.cppreference.net から
| ヘッダで定義 <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 を使用してクラスのデータメンバとして具体化できます。
データメンバ記述 は通常、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!
関連項目
(C++26) |
リフレクションがデータメンバ記述を表すかどうかをチェックします (関数) |
(C++26) |
データメンバ記述のシーケンスから集成体型を定義します (関数テンプレート) |