gpt4 book ai didi

c++ - 依赖于 begin() 函数的 const 迭代器

转载 作者:行者123 更新时间:2023-11-30 05:25:56 26 4
gpt4 key购买 nike

我尽量简化了情况。

基本上我有一个代表动态 Array 的类(这里显示为 class Array,大小为 4),其次是一个类,它是一个 HashMap,并且有一个 Array of Arrays。作为成员(此处由 class Bar 表示)。

两个类都实现了begin()end()因此您可以使用 foreach 循环遍历所有元素。

Array 的迭代器类型就是T*const T*对于 const 变体。对于 Bar有一个特别class Iterator , 它正确地遍历了 Array<Array<T>> 的所有成员.您现在应该看看我提供的类(class),这样您就知道我在说什么了。

But now there is a problem when I call bar.begin() on a const Bar object


Iterator 类确定 ArrayIteratorElementIterator自动类型(通过 T::begin() 的 decltype),因为在我的实际应用程序中几乎所有东西都是模板化的,这就是为什么我事先不知道确切的类型。

我发现问题是 decltype(((T*)nullptr)->begin())总是选择 T 的非常量 begin() 函数,这绝对有意义,因为我还没有写 (const T*)nullptr .

如果我现在从 const 上下文中调用它,它将无法分配 const T*喜欢data.last().end()到内部T*来自实际上应该是 const T* 的 decltype .

我可以通过声明第二类来解决这个问题 ConstIterator它所做的一切都与非常量完全一样,但使用 (const Array<T>*)nullptr(const T*)nullptr在 decltype 语句中。

那么如果不复制整个 Bar::Iterator 类我能做什么呢?


简化代码:

template<class T>
class Array
{
T data[4];

T last() { return data[3]; }


T* begin() { return data; };
T* end() { return data + 4; };

const T* begin() const { return data; };
const T* end() const { return data + 4; };
}

template<class T>
class Bar
{
class Iterator
{
using ArrayIterator = decltype(((Array<T>*)nullptr)->begin());
using ElementIterator = decltype(((T*)nullptr)->begin());

Iterator(const ArrayIterator& beg, const ArrayIterator& end)
{
//initialize the iterator to the first element of the first array
//(and rembember end)
};

Iterator(const ElementIterator& cur)
{
//initialize the iterator to the current element
};

//++ will iterate go to next element and eventually jump to the next array.
//== returns true if the current element is the same
};

Array<T> data;

Iterator begin() { return Iterator(data.begin(), data.end()); };
Iterator end() { return Iterator(data.last().end()); };

Iterator begin() const { return Iterator(data.begin(), data.end()); };
Iterator end() const { return Iterator(data.last().end()); };
};

最佳答案

实际上,您必须实现ConstIterator 类。参见,例如,vectorlist 等标准容器,您同时拥有 iteratorconst_iterator,并且他们是不同的类(class)。 Const 的正确性有时很难。但是,您可以通过使用模板或 const_cast 来避免代码重复(例如,参见 Scott Myers Effective C++)

关于c++ - 依赖于 begin() 函数的 const 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038623/

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