由于感到无聊并想要一些练习(所以,请不要告诉我just use Boost :-))我目前正在实现一个STL风格的计数迭代器。
然而,在实现需要将difference_type
定义为有意义的功能时,我发现我不知道我应该使用什么。起初我想使用迭代器模板化的任何类型,但这会导致无符号类型的明显问题,并且只是去"无论如何,我将使用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 */
}
};
答案 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;