# std::readable_traits

From cppreference.com
< cpp‎ | iterator

Defined in header `<iterator>` |  |
template< class I > struct readable_traits { }; | (1) | (since C++20)
template< class T > struct readable_traits<T*>; | (2) | (since C++20)
template< class I > requires std::is_array_v<I> struct readable_traits<I>; | (3) | (since C++20)
template< class T > struct readable_traits<const T> : value_type<T> { }; | (4) | (since C++20)
template <class T> requires requires { typename T::value_type; } struct readable_traits<T>; | (5) | (since C++20)
template <class T> requires requires { typename T::element_type; } struct readable_traits<T>; | (6) | (since C++20)

Computes the associated value type of the type `I`, if any. Users may specialize `readable_traits` for a program-defined type.

1) Primary template is an empty struct.
2) Specialization for pointers. If `T` is an object type, provides a member type `value_type` equal to std::remove_cv_t<T>. Otherwise, there is no member `value_type`.
3) Specialization for array types. Provides a member type `value_type` equal to std::remove_cv_t<std::remove_extent_t<I>>.
4) Specialization for const-qualified types.
5) Specialization for types that define a public and accessible member type `value_type`. If `T::value_type` is an object type, provides a member type `value_type` equal to std::remove_cv_t<typename T::value_type>. Otherwise, there is no member `value_type`.
6) Specialization for types that define a public and accessible member type `element_type` (e.g., std::shared_ptr). If `T::element_type` is an object type, provides a member type `value_type` equal to std::remove_cv_t<typename T::element_type>. Otherwise, there is no member `value_type`.

### Notes

If a type contains both a `value_type` member and a `element_type` member, then the specializations (5) and (6) are ambiguous.

`value_type` is intended for use with `Readable` types such as iterators. It is not intended for use with ranges.

### Example

| This section is incomplete Reason: no example

### See also

Readable | specifies that a type is readable by applying operator `*` (concept)
iter_value_t iter_reference_t iter_difference_t iter_rvalue_reference_t iter_common_reference_t | computes the associate types of an iterator (alias template)
iterator_traits | provides uniform interface to the properties of an iterator (class template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/readable_traits&oldid=108331"