【发布时间】:2013-12-22 02:17:36
【问题描述】:
我有一个容器(除其他外)公开了一个字符串缓冲区,以及该字符串缓冲区的大写版本。 (嗯,它不只是大写,但在概念上是相似的)我想让调用者做类似的事情:
container c("Example");
auto const iter = c.begin() + 2;
std::printf("%c\n", iter->get_source()); // Prints a
std::printf("%c\n", iter->get_upper()); // Prints A
iter->set('x');
std::puts(c.get()); // Prints Exxmple
std::puts(c.get_upper()); // Prints EXXMPLE
问题是,具有成员函数get_source、get_upper等的“代理”类型没有明显可以存储的位置,并且需要迭代器返回对某物的引用,而不是值. (vector<bool>也有类似问题)
或者,我可以公开某种外壳容器或范围,或者公开完全独立的迭代器开始/结束函数。有没有人做过这样的事情并且知道什么效果很好?
【问题讨论】:
-
operator*返回T&的要求适用于前向迭代器(C++11 24.2.5 前向迭代器 [forward.iterators] 第 1 段)。对于输入或输出迭代器,它不适用。 -
@Casey:在这种情况下,公开输入和/或输出迭代器是不够的——我想支持随机访问。
-
看起来像是范围视图的工作
-
根据我的经验,大多数只读算法在不返回引用的类似迭代器的对象上都能正常工作。显然,排序不起作用。代理类型习语很方便。