gpt4 book ai didi

c++ - 如何为按需构造其值的迭代器实现 operator->?

转载 作者:可可西里 更新时间:2023-11-01 18:38:29 26 4
gpt4 key购买 nike

我有一个像容器一样工作的 C++ 类:它有 size()operator[] 成员函数。存储在容器“中”的值是 std::tuple 对象。但是,容器实际上并不将元组保存在内存中;相反,它根据以不同形式存储的基础数据按需构建它们。

std::tuple<int, int, int>
MyContainer::operator[](std::size_t n) const {
// Example: draw corresponding elements from parallel arrays
return { underlying_data_a[n], underlying_data_b[n], underlying_data_c[n] };
}

因此,operator[] 的返回类型是临时对象,而不是引用。 (这意味着它不是左值,因此容器是只读的;没关系。)

现在我正在编写一个迭代器类,可用于遍历此容器中的元组。我想做模特 RandomAccessIterator , 这取决于 InputIterator ,但 InputIterator 需要支持表达式 i->m(其中 i 是一个迭代器实例),据我所知,一个 operator-> 函数需要返回一个指针。

当然,我不能返回指向按需构建的临时元组的指针。想到的一种可能性是将元组实例作为成员变量放入迭代器中,并使用它来存储迭代器当前位于的任何值的拷贝:

class Iterator {
private:
MyContainer *container;
std::size_t current_index;

// Copy of (*container)[current_index]
std::tuple<int, int, int> current_value;
// ...
};

但是,更新存储的值将需要迭代器检查其当前索引是否小于容器的大小,以便尾后迭代器不会通过访问底层数组的末尾而导致未定义的行为.这增加了(少量的)运行时开销——当然不足以使解决方案不切实际,但感觉有点不雅。迭代器实际上不需要存储任何东西,只需要存储指向它正在迭代的容器的指针和其中的当前位置。

对于按需构造值的迭代器类型,是否有一种干净、行之有效的方法来支持 operator->?其他开发者会怎么做这种事情?

(请注意,我根本不需要支持 operator-> — 我主要实现迭代器以便可以使用C++11“range for”循环,并且 std::tuple 没有任何通常希望通过 -> 访问的成员。但是我尽管如此,我还是想正确地对迭代器概念进行建模;否则感觉就像我在偷工减料。或者我不应该打扰吗?)

最佳答案

template<class T>
struct pseudo_ptr {
T t;
T operator*()&&{return t;}
T* operator->(){ return &t; }
};

然后

struct bar { int x,y; };
struct bar_iterator:std::iterator< blah, blah >{
// ...
pseudo_ptr<bar> operator->() const { return {**this}; }
// ...
};

这取决于如何->有效。

ptr->b用于指针 ptr就是(*ptr).b .

否则定义为(ptr.operator->())->b .如果 operator-> 则递归求值不返回指针。

pseudo_ptr<T>上面为您提供了 T 拷贝的包装器.

但是请注意,生命周期延长并没有真正起作用。结果很脆弱。

关于c++ - 如何为按需构造其值的迭代器实现 operator->?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582845/

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