故事开始于我以为很简单的事情:
我需要设计一个使用一些STL容器的类.我需要给类的用户访问这些容器的不可变版本.我不希望用户能够更改容器(例如,它们不能在列表中push_back()),但是我希望用户能够更改包含的对象(使用back()获取元素并进行修改) :
class Foo { public: // [...] ImmutableListWithMutableElementsType getImmutableListWithMutableElements(); // [...] }; // [...] myList = foo.getImmutableListWithMutableElements(); myElement = myList.back(); myElement.change(42); // OK // [...] // myList.push_back(myOtherElement); // Not possible
乍一看,似乎一个const容器会做.但是当然,您只能在const容器上使用const迭代器,并且无法更改内容.
乍看之下,像专门的容器或迭代器这样的东西可以想到.我可能会结束这一点.
那么,我的想法是“有人一定已经做到了!”或者“一个优雅,通用的解决方案必须存在!”我在这里问我的第一个问题:
如何将标准容器设计/转换成具有可变内容的不可变容器?
我正在努力,但我觉得有人会说“嘿,我每次都这样做,很容易,看!”,所以我问…
感谢您提供任何提示,建议或精彩的通用方式来做到这一点:)
编辑:
经过一些实验,我最终得到了处理一些特别装饰的智能指针的标准容器.它接近尼古拉回答.
可变元素的不可变容器的想法不是一个杀人的概念,请参阅Oli回答中的有趣的注释.
当然,一个特定的迭代器的想法是正确的,但是似乎并不实际,因为我需要适应任何类型的容器.
感谢大家的帮助.
解决方法
最简单的选项可能是指针的标准STL容器,因为常量不传播到实际对象.一个问题是,STL不会清理您分配的任何堆内存.看看
Boost Pointer Container Library或
smart pointers.