gpt4 book ai didi

c++ - 如何将适当的 const_iterator 返回到非常量指针的集合?

转载 作者:行者123 更新时间:2023-11-30 02:40:27 24 4
gpt4 key购买 nike

我有一个类封装了指向类 MyClass 的指针 vector (指针而不是实例,因为 MyClass 实际上是一个广泛的子类层次结构的基类,实例保存在收藏中)。 vector 不能保存 const 指针,因为集合拥有对象并在其析构函数中删除它们。

该集合的用户应该对集合中的项目具有只读访问权限。常规的 const_iterator 不会在这里完成这项工作,因为它会允许类的用户修改项目,所以我做了这个 typedef:

    class MyCollection
{
private:
std::vector<MyClass*> backingCollection;
public:
typedef std::vector<MyClass const*>::const_iterator const_iterator;

MyCollection 需要有 begin 和 end 方法来返回这些迭代器。然而,backingCollection.begin() 返回常规 const_iterator,所以我不得不拼凑出一个看起来很可怕的类型转换:

    inline const_iterator begin() const 
{
return *reinterpret_cast<const_iterator*>(&this->backingCollection.begin());
}

这在我仅在 Visual Studio 中编译项目时工作正常,但 GCC 讨厌它:

error: taking address of temporary [-fpermissive]

我不想仅仅因为这个而启用宽容模式。

这里最好的解决方案是什么?const 迭代器的整个想法是错误的吗?有没有更好的方法来转换迭代器?

最佳答案

使用.data()代替begin,它返回一个指向const指针的指针,并隐式转换为指向const的指针指向const。对于 end 返回数据加上大小。

您失去了调试工具,仅此而已。

typedef MyClass const*const* const_iterator;

inline const_iterator begin() const {
return backingCollection.data();
}
inline const_iterator end() const {
return begin()+backingCollection.size();
}

关于c++ - 如何将适当的 const_iterator 返回到非常量指针的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28932478/

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