Skip to content

Commit 7424626

Browse files
committed
define_static_arrayを使用
1 parent ed10402 commit 7424626

53 files changed

Lines changed: 187 additions & 149 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lang/cpp26/reflection.md

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ enum class Color { red, green, blue };
3232
template <typename E>
3333
requires std::is_enum_v<E>
3434
constexpr std::string_view to_string(E value) {
35-
template for (constexpr auto e : std::meta::enumerators_of(^^E)) { // 型から列挙子のリストを取得
35+
template for (constexpr auto e : std::define_static_array(std::meta::enumerators_of(^^E)) { // 型から列挙子のリストを取得
3636
if (value == [:e:]) {
3737
return std::meta::identifier_of(e); // 列挙子の名前を文字列として取得
3838
}
@@ -93,10 +93,12 @@ struct S {
9393
void f(double);
9494
};
9595
96-
// members_of()で個々のオーバーロードを取得
97-
constexpr auto members = std::meta::members_of(
98-
^^S, std::meta::access_context::unchecked());
99-
// フィルタリングで特定のオーバーロードを選択できる
96+
consteval {
97+
// members_of()で個々のオーバーロードを取得
98+
auto members = std::meta::members_of(
99+
^^S, std::meta::access_context::unchecked());
100+
// フィルタリングで特定のオーバーロードを選択できる
101+
}
100102
```
101103
* std::meta::members_of[link /reference/meta/members_of.md]
102104
* std::meta::access_context[link /reference/meta/access_context.md]
@@ -132,13 +134,16 @@ constexpr std::meta::info rv = ^^value;
132134

133135
```cpp
134136
struct S { int x; int y; };
135-
S s{1, 2};
136137

137-
constexpr auto members = std::meta::nonstatic_data_members_of(
138-
^^S, std::meta::access_context::unchecked());
138+
consteval void example() {
139+
S s{1, 2};
140+
141+
auto members = std::meta::nonstatic_data_members_of(
142+
^^S, std::meta::access_context::unchecked());
139143

140-
int a = s.[:members[0]:]; // s.x と等価。a == 1
141-
int b = s.[:members[1]:]; // s.y と等価。b == 2
144+
int a = s.[:members[0]:]; // s.x と等価。a == 1
145+
int b = s.[:members[1]:]; // s.y と等価。b == 2
146+
}
142147
```
143148
* std::meta::nonstatic_data_members_of[link /reference/meta/nonstatic_data_members_of.md]
144149
* std::meta::access_context[link /reference/meta/access_context.md]
@@ -151,10 +156,12 @@ int b = s.[:members[1]:]; // s.y と等価。b == 2
151156
struct Base { int b; };
152157
struct Derived : Base { int d; };
153158
154-
Derived obj{{42}, 100};
155-
constexpr auto bases = std::meta::bases_of(
156-
^^Derived, std::meta::access_context::unchecked());
157-
Base& base_ref = obj.[:bases[0]:]; // 基底クラスのサブオブジェクトへの参照
159+
consteval void example() {
160+
Derived obj{{42}, 100};
161+
auto bases = std::meta::bases_of(
162+
^^Derived, std::meta::access_context::unchecked());
163+
Base& base_ref = obj.[:bases[0]:]; // 基底クラスのサブオブジェクトへの参照
164+
}
158165
```
159166
* std::meta::bases_of[link /reference/meta/bases_of.md]
160167
* std::meta::access_context[link /reference/meta/access_context.md]
@@ -237,9 +244,9 @@ struct [[=Name{std::define_static_string("点")}]] Point {
237244

238245
// メンバのアノテーションを取得
239246
template for (constexpr auto m :
240-
std::meta::nonstatic_data_members_of(^^Point,
241-
std::meta::access_context::unchecked())) {
242-
constexpr auto annots = std::meta::annotations_of_with_type(m, ^^Name);
247+
std::define_static_array(std::meta::nonstatic_data_members_of(^^Point,
248+
std::meta::access_context::unchecked()))) {
249+
auto annots = std::meta::annotations_of_with_type(m, ^^Name);
243250
if constexpr (annots.size() > 0) {
244251
std::println("{}: {}", [:annots[0]:].value,
245252
std::meta::identifier_of(m));
@@ -263,17 +270,16 @@ template for (constexpr auto m :
263270
template <typename E>
264271
requires std::is_enum_v<E>
265272
constexpr std::string_view enum_to_string(E value) {
266-
template for (constexpr auto e : std::meta::enumerators_of(^^E)) {
273+
template for (constexpr auto e : std::define_static_array(std::meta::enumerators_of(^^E))) {
267274
if (value == [:e:]) {
268-
return std::define_static_string(std::meta::identifier_of(e));
275+
return std::meta::identifier_of(e);
269276
}
270277
}
271278
return "<unknown>";
272279
}
273280
```
274281
* std::meta::enumerators_of[link /reference/meta/enumerators_of.md]
275282
* std::meta::identifier_of[link /reference/meta/identifier_of.md]
276-
* std::define_static_string[link /reference/meta/define_static_string.md]
277283

278284

279285
## リフレクションのエラー処理
@@ -297,8 +303,8 @@ int main() {
297303
Point p{10, 20, "origin"};
298304

299305
template for (constexpr auto m :
300-
std::meta::nonstatic_data_members_of(^^Point,
301-
std::meta::access_context::unchecked())) {
306+
std::define_static_array(std::meta::nonstatic_data_members_of(^^Point,
307+
std::meta::access_context::unchecked()))) {
302308
std::println("{}: {}", std::meta::identifier_of(m), p.[:m:]);
303309
}
304310
}
@@ -327,7 +333,7 @@ enum class Color { red, green, blue };
327333
template <typename E>
328334
requires std::is_enum_v<E>
329335
constexpr std::string_view to_string(E value) {
330-
template for (constexpr auto e : std::meta::enumerators_of(^^E)) {
336+
template for (constexpr auto e : std::define_static_array(std::meta::enumerators_of(^^E))) {
331337
if (value == [:e:]) {
332338
return std::meta::identifier_of(e);
333339
}
@@ -361,7 +367,7 @@ blue
361367
void process(int id, double value, const char* name) {}
362368

363369
int main() {
364-
template for (constexpr auto p : std::meta::parameters_of(^^process)) {
370+
template for (constexpr auto p : std::define_static_array(std::meta::parameters_of(^^process))) {
365371
std::println("パラメータ: {} (型: {})",
366372
std::meta::identifier_of(p),
367373
std::meta::display_string_of(std::meta::type_of(p)));

reference/meta/access_context.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,16 @@ int main() {
4444
// unchecked: すべてのメンバにアクセス
4545
std::println("unchecked:");
4646
template for (constexpr auto m :
47-
std::meta::nonstatic_data_members_of(
48-
^^MyClass, std::meta::access_context::unchecked())) {
47+
std::define_static_array(std::meta::nonstatic_data_members_of(
48+
^^MyClass, std::meta::access_context::unchecked()))) {
4949
std::println(" {}", std::meta::identifier_of(m));
5050
}
5151
5252
// unprivileged: publicのみ
5353
std::println("unprivileged:");
5454
template for (constexpr auto m :
55-
std::meta::nonstatic_data_members_of(
56-
^^MyClass, std::meta::access_context::unprivileged())) {
55+
std::define_static_array(std::meta::nonstatic_data_members_of(
56+
^^MyClass, std::meta::access_context::unprivileged()))) {
5757
std::println(" {}", std::meta::identifier_of(m));
5858
}
5959
}

reference/meta/access_context/current.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public:
3333
// current()はC内部からの呼び出しなのでprivateメンバも見える
3434
std::println("C内部から見えるメンバ:");
3535
template for (constexpr auto m :
36-
std::meta::nonstatic_data_members_of(
37-
^^C, std::meta::access_context::current())) {
36+
std::define_static_array(std::meta::nonstatic_data_members_of(
37+
^^C, std::meta::access_context::current()))) {
3838
std::println(" {}", std::meta::identifier_of(m));
3939
}
4040
}
@@ -46,8 +46,8 @@ int main() {
4646
// current()はmain関数からの呼び出しなのでpublicのみ
4747
std::println("外部から見えるメンバ:");
4848
template for (constexpr auto m :
49-
std::meta::nonstatic_data_members_of(
50-
^^C, std::meta::access_context::current())) {
49+
std::define_static_array(std::meta::nonstatic_data_members_of(
50+
^^C, std::meta::access_context::current()))) {
5151
std::println(" {}", std::meta::identifier_of(m));
5252
}
5353
}

reference/meta/access_context/unchecked.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public:
3535
int main() {
3636
std::println("全メンバ:");
3737
template for (constexpr auto m :
38-
std::meta::nonstatic_data_members_of(
39-
^^C, std::meta::access_context::unchecked())) {
38+
std::define_static_array(std::meta::nonstatic_data_members_of(
39+
^^C, std::meta::access_context::unchecked()))) {
4040
std::println(" {}", std::meta::identifier_of(m));
4141
}
4242
}

reference/meta/access_context/unprivileged.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public:
3333
int main() {
3434
std::println("publicメンバ:");
3535
template for (constexpr auto m :
36-
std::meta::nonstatic_data_members_of(
37-
^^C, std::meta::access_context::unprivileged())) {
36+
std::define_static_array(std::meta::nonstatic_data_members_of(
37+
^^C, std::meta::access_context::unprivileged()))) {
3838
std::println(" {}", std::meta::identifier_of(m));
3939
}
4040
}

reference/meta/access_context/via.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class Derived : public Base {};
3737
int main() {
3838
// Derived経由でBaseのメンバにアクセス
3939
constexpr auto ctx = std::meta::access_context::current().via(^^Derived);
40-
constexpr auto members = std::meta::nonstatic_data_members_of(^^Base, ctx);
41-
std::println("Derived経由で見えるメンバ数: {}", members.size());
40+
constexpr auto count = std::meta::nonstatic_data_members_of(^^Base, ctx).size();
41+
std::println("Derived経由で見えるメンバ数: {}", count);
4242
}
4343
```
4444
* via[color ff0000]

reference/meta/annotations_of.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct Label { const char* text; };
2929
struct [[=Label{std::define_static_string("my struct")}, =42]] S {};
3030
3131
int main() {
32-
constexpr auto annots = std::meta::annotations_of(^^S);
32+
constexpr auto annots = std::define_static_array(std::meta::annotations_of(^^S));
3333
std::println("アノテーション数: {}", annots.size());
3434
3535
template for (constexpr auto a : annots) {

reference/meta/annotations_of_with_type.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ struct [[=Name{std::define_static_string("点")}, =42]] Point {
3232
};
3333
3434
int main() {
35-
constexpr auto annots = std::meta::annotations_of_with_type(^^Point, ^^Name);
36-
static_assert(annots.size() == 1);
37-
std::println("{}", [:annots[0]:].value);
35+
static_assert(std::meta::annotations_of_with_type(^^Point, ^^Name).size() == 1);
36+
template for (constexpr auto a :
37+
std::define_static_array(
38+
std::meta::annotations_of_with_type(^^Point, ^^Name))) {
39+
std::println("{}", [:a:].value);
40+
}
3841
}
3942
```
4043

reference/meta/bases_of.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ struct C : A, B {};
3939
int main() {
4040
// クラスCの直接基底クラスを取得して出力
4141
template for (constexpr auto b :
42-
std::meta::bases_of(^^C, std::meta::access_context::unchecked())) {
42+
std::define_static_array(std::meta::bases_of(^^C, std::meta::access_context::unchecked()))) {
4343
std::println("{}", std::meta::display_string_of(std::meta::type_of(b)));
4444
}
4545
}

reference/meta/bit_size_of.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,15 @@ struct Flags {
3232
unsigned b : 3;
3333
};
3434
35-
int main() {
36-
constexpr auto members = std::meta::nonstatic_data_members_of(
35+
consteval bool check() {
36+
auto members = std::meta::nonstatic_data_members_of(
3737
^^Flags, std::meta::access_context::unchecked());
38-
static_assert(std::meta::bit_size_of(members[0]) == 1);
39-
static_assert(std::meta::bit_size_of(members[1]) == 3);
38+
return std::meta::bit_size_of(members[0]) == 1
39+
&& std::meta::bit_size_of(members[1]) == 3;
40+
}
41+
42+
int main() {
43+
static_assert(check());
4044
}
4145
```
4246

0 commit comments

Comments
 (0)