-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcase_4.h
More file actions
65 lines (53 loc) · 1.77 KB
/
Copy pathcase_4.h
File metadata and controls
65 lines (53 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//
// Created by belov on 14.07.2026.
//
#pragma once
namespace case_4 {
template <typename A>
consteval bool has_annotation(std::meta::info info) {
return not std::meta::annotations_of_with_type(info, ^^A).empty();
}
struct Component {};
namespace some_dir {
class [[=Component{}]] D1 {
public:
void run() {}
};
class [[=Component{}]] D2 {
public:
void run() {}
};
class D3 {
public:
void run() {}
};
}
void case_4() {
constexpr auto ctx = std::meta::access_context::current();
static constexpr auto classList = std::define_static_array(std::meta::members_of(^^some_dir, ctx));
static_assert(classList.size() == 3);
template for (constexpr auto obj : classList) {
static_assert(std::meta::is_class_type(obj));
}
auto getAnnotatedClassListSize = [&]() consteval -> auto {
std::size_t t = 0;
template for (constexpr auto obj : classList) {
if (has_annotation<Component>(obj))
t += 1;
}
return t;
};
auto getAnnotatedClassList = [&]() consteval -> auto {
constexpr auto size = getAnnotatedClassListSize();
std::size_t c = 0;
std::array<std::meta::info, size> array{};
template for (constexpr auto obj : classList) {
if (has_annotation<Component>(obj))
array[c++] = obj;
}
return array;
};
constexpr auto annotatedClassList = getAnnotatedClassList();
static_assert(annotatedClassList == std::array<std::meta::info, 2>{^^some_dir::D1, ^^some_dir::D2});
}
}