首页 > 解决方案 > 获取智能指针容器的 const 视图的方法

问题描述

对于公开值类型容器的类,对容器成员的 const 访问很简单。例如:

#include <vector>
#include <iostream>

class IntVecClass {
  public:
    IntVecClass() : fVec({1, 2, 3}) {}

    const std::vector<int>& getVector() const {
        return fVec;
    }

  private:
    std::vector<int> fVec;
};

int main(int argc, char* argv[]) {
    IntVecClass intVec;
    for (auto& elem : intVec.getVector()) {
        std::cout<< elem << std::endl;
        //elem = 1; FAILS TO COMPILE. GOOD!
    }
}

然而,如果“int”改为“std::unique_ptr”,尽管 getVector 的调用者不能修改 std::unique_ptr,但包含在 std::unique_ptr 中的 int 是可修改的。

将 const 视图放入智能指针容器的好方法是什么?到目前为止,我已经想出了使用提升范围和变换:

#include <vector>
#include <iostream>
#include <memory>

#include <boost/range/adaptors.hpp>
#include <boost/range/iterator_range.hpp>

class PtrVecClass {
  public:
    PtrVecClass() : fVptr() {
        fVptr.push_back(std::make_unique<int>(1));
        fVptr.push_back(std::make_unique<int>(2));
        fVptr.push_back(std::make_unique<int>(3));
    }

    auto getRange() const {
        auto r = boost::make_iterator_range(std::cbegin(fVptr), std::cend(fVptr));
        return r | boost::adaptors::transformed([](const auto& elem) { return elem.get(); });
    }

  private:
    std::vector<std::unique_ptr<int>> fVptr;
};

int main(int argc, char* argv[]) {
    PtrVecClass ptrVecClass;
    for (auto elem : ptrVecClass.getRange()) {
        std::cout<< *elem << std::endl;
        //*elem = 1; DOES COMPILE, BUT ALTERS THE CONTAINED INT.
    }
}

标签: c++

解决方案


推荐阅读