-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy path233.md
70 lines (51 loc) · 1.69 KB
/
233.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
<details open><summary>Info</summary><p>
* **Did you know that C++20 made `typename` more optional?**
* http://wg21.link/p0634
</p></details><details open><summary>Example</summary><p>
```cpp
template<class T> /*typename*/T::type return_type(); // okay
template<class T> void void_parameter(/*typename*/T::type); // error: variable or field 'parameter' declared void
template<class T> auto auto_parameter(/*typename*/T::type); // okay
template<class T>
struct traits {
using type = /*typename*/ T::type; // okay
};
```
> https://godbolt.org/z/oMMzfjeKv
</p></details><details open><summary>Puzzle</summary><p>
* **Can you add/remove required/unnecessary `typename's`**
```cpp
template<class T>
struct traits {
using type = typename T::type;
};
template<class T>
struct s : typename T::type {};
template<class T> typename T::type f1();
template<class T> auto f2() -> typename T::type;
auto f3(auto t) -> typename decltype(t)::type;
template<class T> auto f4(typename T::type);
template<class T> bool f5(typename T::type);
template<class T> void f6(T::type);
template<class T> auto f7(T::type) -> void;
auto f8(auto t) -> typename decltype(t)::type;
```
> https://godbolt.org/z/EEeTh5TWP
</p></details><details><summary>Solutions</summary><p>
```cpp
template<class T>
struct traits {
using type = T::type;
};
template<class T>
struct s : T::type {};
template<class T> T::type f1();
template<class T> auto f2() -> T::type;
auto f3(auto t) -> decltype(t)::type;
template<class T> auto f4(T::type);
template<class T> bool f5(T::type);
template<class T> void f6(typename T::type);
template<class T> auto f7(typename T::type) -> void;
auto f8(auto t) -> decltype(t)::type;
```
> https://godbolt.org/z/nMsqeaev8