实施 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;
我正在实现我自己的范围版本,因为它们还不在标准库中。我在实施 std::iter_difference_t
.
latest draft 说:
The type
iter_difference_t<I>
denotes
incrementable_traits<I>::difference_type
ifiterator_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;