Skip to content

Commit

Permalink
[351] - Did you know about C++26 proposal - variadic friends?
Browse files Browse the repository at this point in the history
  • Loading branch information
krzysztof-jusiak committed Oct 14, 2023
1 parent 609e1ff commit 8b1e322
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

> C++26
* [Did you know about C++26 proposal - `variadic friends`?](https://github.com/tip-of-the-week/cpp/blob/master/tips/352.md)
* [Did you know about C++26 proposal - `inplace_vector`?](https://github.com/tip-of-the-week/cpp/blob/master/tips/351.md)
* [Did you know about C++26 proposal - Aggregates are named tuples?](https://github.com/tip-of-the-week/cpp/blob/master/tips/350.md)
* [Did you know that C++26 added new SI prefixes?](https://github.com/tip-of-the-week/cpp/blob/master/tips/349.md)
Expand Down
2 changes: 2 additions & 0 deletions tips/351.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,5 @@ class inplace_vector {
```

> https://godbolt.org/z/scz4EfTa5
</p></details>
73 changes: 73 additions & 0 deletions tips/352.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<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>
</p></details>

0 comments on commit 8b1e322

Please sign in to comment.