[英]How to ensure constness of the returning vector<unique_ptr>
我在這里問了相關問題。 現在它有點微妙。
這是代碼:
class MyClass {
public:
const vector<unique_ptr<MyObject> >& get_const_objs() const;
private:
vector<unique_ptr<MyObject>> m_objs;
};
我的意圖是來自get_const_objs()的返回向量是只讀的,但問題是因為向量的元素不是const,所以調用者仍然可以更改單個元素,例如
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
我的解決方案是將const插入向量:
const vector<const unique_ptr<MyObject> >& get_const_objs() const;
但是這導致了一個無聊的get_const_objs()實現,我將每個元素復制到一個新的向量:
const vector<const unique_ptr<MyObjects>>& MyClass::get_const_objs() const
{
vector<const unique_ptr<MyObjects>> ret;
for (const auto &obj : my_objs) {
ret.push_back(obj);
}
return ret;
}
是的,我可以在MyClass中添加迭代器接口。 還有其他解決方案嗎?
我有一個限制:BOOST不可用。 但我喜歡知道BOOST解決方案,如果確實有一個好的只是使用標准。
一個(小)更好的解決方案是返回std::vector<const MyObject*>
而不暴露std::unique_ptr
。
std::vector<const MyObject*> get_const_objs() const
{
std::vector<const MyObject*> res;
res.reserve(my_objs.size());
for (const auto& obj : my_objs) {
res.push_back(obj.get());
}
return res;
}
您可以將此向量作為成員,而不是每次都重新創建向量,但是您需要保持向量同步。
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
你不能這樣做 ,所以你不必擔心!
由於objs
是const vector<> &
,因此該向量的元素也被視為const
。 因此,你不能“移動”它; 你能移動const對象嗎?
自定義迭代器似乎是最簡單的方法,只需公開一個解除引用到const MyObject&的迭代器
class ConstObjectIter {
public:
...
const MyObject& operator* () const { return **m_it; }
const MyObject* operator->() const { return &**this; }
ConstIter& operator++() { ++m_it; return *this; }
...
private:
std::vector<std::unique_ptr<MyObject> >::const_iterator m_it, m_end;
}
初始化m_it, m_end
與m_objs.begin(), m_objs.end()
resp。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.