From Jason Turner

[readable.traits]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpxh4virtt/{from.md → to.md} +18 -4
tmp/tmpxh4virtt/{from.md → to.md} RENAMED
@@ -18,10 +18,16 @@ template<class T>
18
  requires is_object_v<T>
19
  struct cond-value-type<T> {
20
  using value_type = remove_cv_t<T>;
21
  };
22
 
 
 
 
 
 
 
23
  template<class> struct indirectly_readable_traits { };
24
 
25
  template<class T>
26
  struct indirectly_readable_traits<T*>
27
  : cond-value-type<T> { };
@@ -34,20 +40,28 @@ struct indirectly_readable_traits<I> {
34
 
35
  template<class I>
36
  struct indirectly_readable_traits<const I>
37
  : indirectly_readable_traits<I> { };
38
 
39
- template<class T>
40
- requires requires { typename T::value_type; }
41
  struct indirectly_readable_traits<T>
42
  : cond-value-type<typename T::value_type> { };
43
 
44
- template<class T>
45
- requires requires { typename T::element_type; }
46
  struct indirectly_readable_traits<T>
47
  : cond-value-type<typename T::element_type> { };
48
 
 
 
 
 
 
 
 
 
 
 
49
  template<class T> using iter_value_t = see below;
50
  ```
51
 
52
  Let R_`I` be `remove_cvref_t<I>`. The type `iter_value_t<I>` denotes
53
 
 
18
  requires is_object_v<T>
19
  struct cond-value-type<T> {
20
  using value_type = remove_cv_t<T>;
21
  };
22
 
23
+ template<class T>
24
+ concept has-member-value-type = requires { typename T::value_type; }; // exposition only
25
+
26
+ template<class T>
27
+ concept has-member-element-type = requires { typename T::element_type; }; // exposition only
28
+
29
  template<class> struct indirectly_readable_traits { };
30
 
31
  template<class T>
32
  struct indirectly_readable_traits<T*>
33
  : cond-value-type<T> { };
 
40
 
41
  template<class I>
42
  struct indirectly_readable_traits<const I>
43
  : indirectly_readable_traits<I> { };
44
 
45
+ template<has-member-value-type T>
 
46
  struct indirectly_readable_traits<T>
47
  : cond-value-type<typename T::value_type> { };
48
 
49
+ template<has-member-element-type T>
 
50
  struct indirectly_readable_traits<T>
51
  : cond-value-type<typename T::element_type> { };
52
 
53
+ template<has-member-value-type T>
54
+ requires has-member-element-type<T>
55
+ struct indirectly_readable_traits<T> { };
56
+
57
+ template<has-member-value-type T>
58
+ requires has-member-element-type<T> &&
59
+ same_as<remove_cv_t<typename T::element_type>, remove_cv_t<typename T::value_type>>
60
+ struct indirectly_readable_traits<T>
61
+ : cond-value-type<typename T::value_type> { };
62
+
63
  template<class T> using iter_value_t = see below;
64
  ```
65
 
66
  Let R_`I` be `remove_cvref_t<I>`. The type `iter_value_t<I>` denotes
67