c – 具有可变内容的不可变容器

前端之家收集整理的这篇文章主要介绍了c – 具有可变内容的不可变容器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
故事开始于我以为很简单的事情:

我需要设计一个使用一些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 Librarysmart pointers.

猜你在找的C&C++相关文章