什么是difference_type计数迭代器的好选择?
What is a good choice for difference_type of counting iterators?
由于无聊,想要一些练习(所以,请不要告诉我只使用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;
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 如何从目录迭代器中选择特定文件并进行比较
- 如何在目录迭代器中选择特定的目录条目
- 如何基于循环迭代器选择函数
- 选择"common functionality"迭代器类别
- C++整数类的范围 - 可供选择的迭代器类型
- initializer_list迭代器定义的选择
- 对于vector,为什么选择迭代器而不是指针呢?
- 什么是difference_type计数迭代器的好选择?