.. _bidirectional_iterator: **************************** meta::bidirectional_iterator **************************** Defined in header ````. .. code-block:: cpp template concept bidirectional_iterator = meta::forward_iterator && meta::derived_from, std::bidirectional_iterator_tag> && requires(I i) { { --i } -> meta::same_as; { i-- } -> meta::same_as; }; Pre-C++20 implementation of the :concept:`bidirectional_iterator` concept. ---- Concept emulation ================= .. code-block:: cpp namespace mgs { namespace meta { template struct is_bidirectional_iterator { /* ... */ }; template constexpr auto is_bidirectional_iterator_v = is_bidirectional_iterator::value; template >> using bidirectional_iterator = I; } // namespace meta } // namespace mgs Example ======= .. code-block:: cpp #include using namespace mgs::meta; static_assert(is_bidirectional_iterator_v::iterator>, ""); static_assert(is_bidirectional_iterator_v, ""); static_assert(!is_bidirectional_iterator_v>, ""); See also ======== * :ref:`forward_iterator` * :ref:`derived_from` * :ref:`iter_concept`