对于计数迭代器的difference_type,什么是一个好的选择?

时间:2014-03-17 20:07:55

标签: c++ stl

由于感到无聊并想要一些练习(所以,请不要告诉我just use Boost :-))我目前正在实现一个STL风格的计数迭代器。

然而,在实现需要将difference_type定义为有意义的功能时,我发现我不知道我应该使用什么。起初我想使用迭代器模板化的任何类型,但这会导致无符号类型的明显问题,并且只是去"无论如何,我将使用ptrdiff_t",当使用任意大小的整数进行模板化时会导致潜在的问题。

基本上我的问题归结为应该替换下面代码中的?。 (C ++ 11欢迎,我已经在使用static_assertnoexcept说明符等等。

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 */
    }
};

1 个答案:

答案 0 :(得分:1)

计算迭代器是一种开始的黑客攻击。它的重点是将operator *添加到整数类型。如果这真的是他们所有的,那么没有人关心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;