什么是difference_type计数迭代器的好选择?

What is a good choice for difference_type of counting iterators?

本文关键字:迭代器 选择 difference type 什么      更新时间:2023-10-16

由于无聊,想要一些练习(所以,请不要告诉我只使用Boost:-)),我目前正在实现一个stl风格的计数迭代器。

然而,在实现需要将difference_type定义为有意义的函数时,我发现我不知道我应该实际使用什么。一开始我只是想使用迭代器模板化的任何类型,但这会导致unsigned类型的明显问题,并且当模板化为任意大小的整数时,"不管怎样,我将使用ptrdiff_t"会导致潜在的问题。

基本上我的问题归结为什么应该取代?在下面的代码。(欢迎c++ 11,我已经在使用static_assert, noexcept说明符等)

template <typename Num>
class counting_iterator{
    typedef Num value_type;
    typedef counting_iterator<value_type> iter;
    typedef ? difference_type;
    /* Constructors, etc omitted for clarity */
    difference_type operator-(const iter& rhs) const {
        /* Calculate the difference here */
    }
};

计数迭代器一开始就是一种技巧。它的全部意义在于给整型添加运算符*。如果这真的是它们的全部作用,那么没有人关心difference_type是什么。如果你想让它在任何情况下都正确,那么当Num为有符号时,它应该是相同的类型,当Num为无符号时,它应该是至少多一位的有符号类型。

应该是这样的:

template <typename Num, bool IS_SIGNED>
class DifferenceType
{
public:
    typedef Num type;
};
template <unsigned DIGITS, bool DIGITS_32_OR_LESS>
class TypeLargerThanImp3
{
public:
    typedef int64 type;
};
template <unsigned DIGITS, bool DIGITS_16_OR_LESS>
class TypeLargerThanImp2
{
public:
    typedef int32 type;
};
template <unsigned DIGITS>
class TypeLargerThanImp2<DIGITS, false>
{
public:
    typedef TypeLargerThanImp3<DIGITS, (DIGITS<=32) >::type type;
};
template <unsigned DIGITS, bool DIGITS_8_OR_LESS>
class TypeLargerThanImp
{
public:
    typedef int16 type;
};
template <unsigned DIGITS>
class TypeLargerThanImp<DIGITS, false>
{
public:
    typedef TypeLargerThanImp2<DIGITS, (DIGITS<=16) >::type type;
};
template <unsigned DIGITS>
class TypeLargerThan
{
public:
    typedef TypeLargerThanImp<DIGITS, (DIGITS<=8) >::type type;
};
template <typename Num>
class DifferenceType<Num, false>
{
public:
    typedef TypeLargerThan<std::numeric_limits<Num>::digits>::type type;
};

和你的不同类型:

typedef DifferenceType<Num, std::numeric_limits<Num>::is_signed>::type difference_type;