- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于无聊和想要一些练习(所以,请不要告诉我 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 */
}
};
最佳答案
计数迭代器从一开始就是一种黑客攻击。它的重点是将 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/
由于无聊和想要一些练习(所以,请不要告诉我 just use Boost :-))我目前正在实现一个 STL 风格的计数迭代器。 但是,在实现需要将 difference_type 定义为有意义的东西
当我尝试使用 std::distance 时使用 gcc 4.7 下的自定义迭代器,它提示找不到 difference_type .遗憾的是,我不知道为什么会失败。 #include class n
我正在为第 3 方 C 库编写 C++ 包装器。 该库提供了一些用于迭代一系列对象的函数。 我想编写一个迭代器来包装此行为,以便迭代更容易,但我想不出我将如何提供强制性的“差异”类型,因为迭代对象没有
我有一些序列化逻辑,其中我还序列化了 STL 数据结构。目前,我只是编写大小字段,然后通过遍历它来编写结构的每个元素。在反序列化中,我读取了大小字段,然后我知道何时读取完数据结构。 不,问题是如何正确
vector两者都有vector::size_type和 vector::difference_type .从size_type 开始,两者似乎都没有必要存在。保证能够保存与 vector 的最大元素
今天我正在替换一个低级的 C 风格的方法,该方法将缓冲区保存到文件中。整个事情看起来像这样: bool Profile::save(const char* path) { FILE* p
我看到 iterator_traits 总是定义一个 difference_type:https://en.cppreference.com/w/cpp/iterator/iterator_trait
我正在尝试找出 difference_type 成员对于满足 std::weakly_incrementable 的重要性概念。我目前正在定义一个满足 std::output_iterator 的类,
我正在尝试使用 reverse_iterator 从反向位置删除列表的特定项目。但是 STL_iterator.h 头文件中出现编译错误。 我正在尝试做... 这里的input[]是一个整数数组。
为什么返回类型是 std::count difference_type迭代器(通常是 ptrdiff_t )。 由于计数永远不会是负数,所以 size_t 技术上正确的选择?如果计数超出 ptrdif
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why does the C++ standard algorithm “count” return a pt
在我的项目中,我想将流拆分为一些给定类型的值,所以我实现了一个模板函数 template TOutputIter SplitSpace(std::istream& IS, TOutputIter r
我正在尝试使用这个 vector.h 函数: random_shuffle(s.begin()+from+i,s.begin()+to,s); 发生此错误: c:\program files (x8
我是一名优秀的程序员,十分优秀!