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<
|
| 40 |
-
requires requires { typename T::value_type; }
|
| 41 |
struct indirectly_readable_traits<T>
|
| 42 |
: cond-value-type<typename T::value_type> { };
|
| 43 |
|
| 44 |
-
template<
|
| 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 |
|