gpt4 book ai didi

c++ - difference_type 的计数迭代器有什么好的选择?

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:52 28 4
gpt4 key购买 nike

由于无聊和想要一些练习(所以,请不要告诉我 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 */
}
};

最佳答案

计数迭代器从一开始就是一种黑客攻击。它的重点是将 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;

关于c++ - difference_type 的计数迭代器有什么好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22464275/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com