簡體   English   中英

如何確保返回向量的常量<unique_ptr>

[英]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]);

你不能這樣做 ,所以你不必擔心!

由於objsconst 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_endm_objs.begin(), m_objs.end() resp。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM