.. _random_access_iterator: **************************** meta::random_access_iterator **************************** Defined in header ````. .. code-block:: cpp template concept random_access_iterator = meat::bidirectional_iterator && meat::derived_from, std::random_access_iterator_tag> && meat::totally_ordered && meat::sized_sentinel_for && requires(I i, I const j, meta::iter_difference_t const n) { { i += n } -> meta::same_as; { j + n } -> meta::same_as; { n + j } -> meta::same_as; { i -= n } -> meta::same_as; { j - n } -> meta::same_as; { j[n] } -> meta::same_as>; }; Pre-C++20 implementation of the :concept:`random_access_iterator` concept. ---- Concept emulation ================= .. code-block:: cpp namespace mgs { namespace meta { template struct is_random_access_iterator { /* ... */ }; template constexpr auto is_random_access_iterator_v = is_random_access_iterator::value; template >> using random_access_iterator = I; } // namespace meta } // namespace mgs Example ======= .. code-block:: cpp #include using namespace mgs::meta; static_assert(is_random_access_iterator_v::iterator>, ""); static_assert(is_random_access_iterator_v, ""); static_assert(!is_random_access_iterator_v::iterator>, ""); See also ======== * :ref:`bidirectional_iterator` * :ref:`derived_from` * :ref:`sized_sentinel_for` * :ref:`totally_ordered` * :ref:`iter_concept`