Hallo Rainer,
bei C++98 (tag dispatching) und C++20 (concepts) fehlt in den Spezialisierungen fĂĽr input_iterator(_tag) die PrĂĽfung auf n>0. Zudem finde ich die C++17-Variante unĂĽbersichtlich (ist natĂĽrlich Geschmackssache); es verwirren auch die PrĂĽfungen
if constexpr (std::is_base_of_v<X, category>).
Das funktioniert zwar, ein
if constexpr (std::is_same_v<X, category>) ist aber klarer.
template <typename It, typename Distance>
constexpr void advance_17(It& it, const Distance n) noexcept
{
using category = typename std::iterator_traits<It>::iterator_category;
static_assert(std::is_base_of_v<std::input_iterator_tag, category>); // is iterator ?
auto dist = typename std::iterator_traits<It>::difference_type(n);
if constexpr (std::is_same_v<std::random_access_iterator_tag, category>)
{
it += dist;
}
else if constexpr (std::is_same_v<std::bidirectional_iterator_tag, category>)
{
if (dist >= 0) { while (dist--) ++it; }
else { while (dist++) --it; }
}
else
{
while (dist-- > 0) ++it;
}
}
cu
pre alpha
Das Posting wurde vom Benutzer editiert (04.04.2022 17:43).