实施 std::iter_difference_t

Implementing std::iter_­difference_­t

我正在实现我自己的范围版本,因为它们还不在标准库中。我在实施 std::iter_­difference_­t.

时卡住了

latest draft 说:

The type iter_­difference_­t<I> denotes

incrementable_­traits<I>​::​difference_­type if iterator_­traits<I> names a specialization generated from the primary template, and

iterator_­traits<I>​::​​difference_­type otherwise.

似乎最明显的实现是为第一个案例制定一个概念,让第二个案例处理其他所有事情。但我不知道如何将其从英语转换为 C++。有人可以提供代码吗?

第 1 步。成为 std::iterator_traits 的所有者。这让你可以在主要部分写一些东西,比如:

template <typename T>
struct iterator_traits {
    using __secret_am_i_the_primary_alias = iterator_traits;
};

您可以查看的内容:

template <typename T>
concept is_iterator_primary = std::same_as<
    typename iterator_traits<T>::__secret_am_i_the_primary_alias,
    iterator_traits<T>>;

第 2 步。现在非常简单:

template <typename T>
struct iter_difference {
    using type = typename iterator_­traits<I>​::​​difference_­type;
};

template <is_iterator_primary T>
struct iter_difference<T> {
    using type = typename incrementable_­traits<I>​::​difference_­type;
};

template <typename T>
using iter_difference_t = typename iter_difference<T>::type;