通过只读迭代器公开成员数据

Expose Member Data Through Read-only Iterator

本文关键字:成员 数据 迭代器 只读      更新时间:2023-10-16

我有一个类'MyClass',其中包含存储在std::map s中的一些数据。标准映射包含指向对象的指针,例如

private:
   std::map<int,Object*> m_data;

我想将数据暴露给外部世界,但我不希望其他类/函数能够修改(I)映射m_data或(ii) m_data中的值所指向的对象。我想要一些假设的函数,比如getDataBegin(),它在具有上述属性的数据上返回一个迭代器。例如,我希望以下伪代码示例失败:

iterator_type itr = myclass.getDataBegin();
erase(itr); // not allowed because we cannot modify m_data;
itr.second = NULL; // not allowed to change content of m_data (falls under first rule)
itr.second->methodWithSideEffect(); // not allowed because changes content of object pointed to.

简而言之,您可以说我想要对某些成员数据进行只读访问。这有可能以一种好的方式实现吗?如果有,我该怎么做呢?

尝试在地图的const_iterator周围暴露一个boost transform_iterator。转换函数应该类似于

[](const pair<int, object*>& x) 
{
    return make_pair(x.first, const_cast<const object*>(x.second));
}

返回const_iterator, const_iterator允许只读访问。

std::map<int,Object*>::const_iterator const getDataBegin();