-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy path352.md
89 lines (63 loc) · 1.78 KB
/
352.md
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<details open><summary>Info</summary><p>
* **Did you know about C++26 proposal - `variadic friends`?**
* https://wg21.link/P2893
</p></details><details open><summary>Example</summary><p>
```cpp
class FriendClass;
class MyClass {
friend class FriendClass;
public:
constexpr MyClass(int data) : privateData(data) {}
private:
int privateData;
};
struct FriendClass {
constexpr auto accessPrivateData(const MyClass& obj) const {
return obj.privateData;
}
};
constexpr MyClass obj{42};
constexpr FriendClass friend_obj{};
static_assert(42 == friend_obj.accessPrivateData(obj));
```
> https://godbolt.org/z/Te8zzEoPd
</p></details><details open><summary>Puzzle</summary><p>
* **Can you extend `MyClass` so that all `Ts...` will have access to `privateData`?**
```cpp
template<class... Ts>
class MyClass {
// TODO
public:
constexpr explicit MyClass(int data) : privateData(data) {}
private:
int privateData{};
};
template<auto>
struct FriendClass {
constexpr auto accessPrivateData(const auto& obj) const {
return obj.privateData;
}
};
constexpr MyClass<FriendClass<0>, FriendClass<1>, FriendClass<2>> obj{42};
constexpr FriendClass<0> friend_obj0{};
constexpr FriendClass<1> friend_obj1{};
constexpr FriendClass<2> friend_obj2{};
static_assert(42 == friend_obj0.accessPrivateData(obj));
static_assert(42 == friend_obj1.accessPrivateData(obj));
static_assert(42 == friend_obj2.accessPrivateData(obj));
```
> https://godbolt.org/z/81dn33e41
</p></details>
</p></details><details><summary>Solutions</summary><p>
```cpp
template <class... Ts>
class MyClass {
friend Ts...;
public:
constexpr explicit MyClass(int data) : privateData(data) {}
private:
int privateData{};
};
```
> https://godbolt.org/z/noradhE18
</p></details>