c++ - 获取智能指针容器的 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.
}
}
解决方案
推荐阅读
- reactjs - 文件上传和下载 JavaScript
- python - 如何从数学运算符列表中提取并将其解释为数学运算而不是字符串?
- sql - 获取开始日期和结束日期之间的所有记录 [Asp.Net C# Web 窗体]
- powerbi - 分子取决于过滤器但分母固定的快速计算 (DAX)
- entity-framework - 使用实体框架添加控制器失败 - DbContext 错误
- c# - 为什么 postsharp 说我使用高级功能,而 afaik 我没有?
- windows - 运行本地 Docker 镜像时传入环境变量
- graphql - Lighthouse GraphQL - 如何为@belongsToMany 自引用用户类型?
- mongodb - 从特定通道接收命令
- symfony - Symfony 手动 $form->submit(); 多维数组