C++ 差分类型计数迭代器的最佳选择是什么?

C++ 差分类型计数迭代器的最佳选择是什么?,c++,stl,C++,Stl,由于感到无聊并且需要一些练习(所以,请不要告诉我:-),我目前正在实现一个STL风格的计数迭代器 然而,在实现那些需要定义为有意义的函数时,我发现我不知道应该实际使用什么。起初,我只想使用迭代器模板化时使用的任何类型,但这会导致无符号类型出现明显的问题,而仅仅使用“无论如何,我将使用ptrdiff\u t”,在使用任意大小的整数模板化时会导致潜在的问题 基本上,我的问题归结为应该用什么替换下面代码中的?。(欢迎使用C++11,我已经在使用static\u assert,noexcept说明符等)

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

然而,在实现那些需要定义为有意义的函数时,我发现我不知道应该实际使用什么。起初,我只想使用迭代器模板化时使用的任何类型,但这会导致无符号类型出现明显的问题,而仅仅使用“无论如何,我将使用
ptrdiff\u t
”,在使用任意大小的整数模板化时会导致潜在的问题

基本上,我的问题归结为应该用什么替换下面代码中的
。(欢迎使用C++11,我已经在使用
static\u assert
noexcept
说明符等)

模板
类计数迭代器{
typedef Num value_type;
typedef计数迭代器iter;
typedef?差分_型;
/*为清楚起见,省略了构造函数等*/
差分类型运算符-(常量和rhs)常量{
/*在这里计算差异*/
}
};

计算迭代器是一种黑客行为。它的要点是将运算符*添加到整数类型。如果这真的是他们的全部目的,那么就没有人关心他们之间的区别了。 如果您希望在任何情况下都正确,那么当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-Num类型;
};
模板
类别类型大于IMP3
{
公众:
typedef int64型;
};
模板
类别TypeLargerThanImp2
{
公众:
typedef int32型;
};
模板
类别TypeLargerThanImp2
{
公众:

typedef typelarger than imp3我知道你不希望我只是说“使用Boost”,但Boost确实已经有了这个问题的答案。有
Boost::detail::numeric\u traits::difference\u type
或者用户可以覆盖它。严格来说,如果他们不指定类型,他们就不能保证,所以你可以随心所欲地将等效项设置为好或坏。当用户不指定时,你可以只使用
int
,并且期望更好是他们自己的愚蠢错误;-)如果在不了解Num的情况下没有真正的答案,那么让客户机代码指定差异类型。如果您想猜测,请使用某种类型特征(这样,如果不充分了解,您可能会出错,但客户机仍然可以轻松添加对自己类型的支持)或者,如果你觉得幸运的话,只需选择例如int64\t作为默认值-它很可能可以满足tme的99.9%,并使使用更加方便。@SteveJessop我事先看过,从文档中,它是“让客户端代码来做,或者使用非指定的默认值”,这似乎不是一个好的答案。(非指定部分)@Xarn:这就是问题所在,虽然没有指定默认值,但事实上它并不坏。因此,Boost实现实际上如何做比文档保证的更有用。如果你处理所有更简单的细节,那么最终你的问题是(通常)存在没有符号类型能够表示最大无符号类型的任意两个值之间的差异。当然也没有最大有符号类型的差异。这是固定宽度类型的限制。@SteveJessop好的,我可能会使用另一个模板参数+给定平台上任何ptrdiff_t的默认值。(哦,我也不反对“通读Boost better”的答案;-)赞成,但不接受,因为固定宽度类型不适用于此。(见讨论)
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;