gpt4 book ai didi

STL 容器中的 C++11 shared_pointer constness

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:39 25 4
gpt4 key购买 nike

我有以下问题,我想知道是否有更好的方法来解决它:

class myObj {
public:
typedef std::shared_ptr<myObj> handle;
typedef std::shared_ptr<const myObj> const_handle;
int someMethod() { ... }
int someConstMethod() const { ... }
};

现在我需要的是一个容器类,它允许您根据其自身的 constness 修改或读取 myObj 的集合,如下所示:

class myCollection {
public:
typedef std::list<myObj::handle> objList;
typedef std::list<myObj::const_handle> const_objList;

inline objList& modify() { return _obl; }

// it would be nice to do this, but it won't compile as
// objList and const_objList are completely different types
inline const_objList& read() const { return _obl; } // doh! compile error...

// returning a const objList won't help either as it would return non-const
// handles, obviously.

// so I am forced to do this, which sucks as i have to create a new list and copy
void read(const_objList &l) {
std::for_each(
_obl.begin(),
_obl.end(),
[&l] (myObj::handle &h) { l.push_back(h); }
// ok as handle can be cast to const_handle
); // for_each
}

private:
objList _obl;
};

所以这个解决方案实际上作为一个 const myCollection 只允许你得到一个 const_handle 的列表,它只允许你调用 的非修改方法myObj(好)。

问题是“read”方法真的很难看(不好)。

另一种方法是以某种方式公开 list 方法并返回 const_handle 并根据需要进行处理,但它的开销很大,特别是如果你想使用更复杂的东西而不是列表。

有什么想法吗?

最佳答案

List-of-pointers-to-T 不是 list-of-pointers-to-constant-T。

std::list<std::shared_ptr<int>> a;
std::list<std::shared_ptr<const int>>& ra = a; // illegal but imagine it's not
std::shared_ptr<const int> x = std::make_shared<const int>(42);
ra.push_back(x); // totally legal, right?
++**a.begin(); // oops... just incremented a const int

现在,从概念上讲,指向 T 的指针列表是指向常量 T 的常量指针的常量列表,但是 std::list<std::shared_ptr<T>>不支持如此深的 const 传播。 const std::list<std::shared_ptr<T>>包含指向非常量对象的常量指针。

您可以编写自己的 list<> 变体您自己的 shared_ptr<> 变体有这样的支持。不过,这可能不会很容易。 const_propagating_shared_ptr可能是两者中较容易的一个。它必须封装一个 std::shared_ptr<T>反对并按原样转发几乎所有内容。相对于 std::shared_ptr<T>它会有单独的const和非 const operator-> 的版本, operator*()get() .

关于STL 容器中的 C++11 shared_pointer constness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com