boost::multi_index_container in QMap



是否可以使用类似QMap< QString, boost::multi_index_container<...> >的构造?

一方面,我们有private: BOOST_COPYABLE_AND_MOVABLE(multi_index_container)容器声明中。它应该告诉我们不要放置multi_index_container<>放入其他类似stl的容器中。

另一方面,这种结构

QMap< QString, boost::multi_index_container<...> > _map;
map.insert("bla-bla", container1);
...
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
//keyVal corresponds to one for the multi_index_container instance

使用Visual Studio 2012编译得很好(+update4+boost v1.55+qt v4.8.5)。

实验发现:

auto tmp = _map.value(QString("bla-bla")).get<keyVal>();

使得CCD_ 3处理已删除的数据。而

auto tmp = _map.value(QString("bla-bla"));
auto tmp_1 = tmp.get<keyVal>();

留下具有有效数据的CCD_ 4。

有人知道如果我们需要把boost::multi_index_container<>放在另一个容器里,什么是正确的处理方法吗?

Qt5.3有什么不同吗?

如您在QMap:的文档中所见

const T QMap::value(const Key & key, const T & defaultValue = T()) const

该值是通过值返回的,而不是通过引用返回的。除了对大值(例如多索引容器,可能是?)非常低效之外,它还返回一个临时值。

现在,get<keyVal>();确实返回了对第一个索引的引用,它是属于临时索引的索引,临时索引在包含完整表达式的末尾终止。


要获得可修改的参考,请使用

T & QMap::operator[](const Key & key)

现在您可以:

auto& tmp = _map[QString("bla-bla")].get<keyVal>();

请注意&

添加到@see关于如何检索引用而不是临时值的答案中,boost::multi_index_container是可复制和可移动的。您引用的这个BOOST_COPYABLE_AND_MOVABLE宏必须放在类私有部分(如此处所指定),但这不会影响复制/移动actor的可见性。这个故事的寓意是:在深入研究代码之前先咨询文档。

在我的特殊情况下,问题是编译器使用const T operator[](const Key & key) const而不是T & operator[](const Key & key),因为类的方法是const方法,映射是类的字段。

相关内容

  • 没有找到相关文章

最新更新