c++ - 是否有在 std 容器中使用 unique_ptr 的透明方式?
问题描述
是否有std::unique_ptr
在容器中使用的透明方式?
#include <iostream>
#include <memory>
#include <map>
struct method {
virtual ~method() { std::cout << "f\n"; };
};
typedef std::unique_ptr<method> MPTR;
std::map<int, MPTR> tbl;
void insert(int id, method *m) {
tbl.insert({id,std::unique_ptr<method>(m)});
};
void set(int id, method *m) {
tbl[id] = std::unique_ptr<method>(m);
};
int main(int argc, char **argv) {
insert(1,new method());
set(1,new method());
return 0;
}
我想使用tbl.insert({id,m});
等tbl[id] = m;
,而不必为每次访问打包/解包。
- 是否有用于 unique_ptr 的 std 容器的实现?特别是
std::map
。 - 如何实现透明接口?
解决方案
通常,我们不想隐式创建std::unique_ptr
,因为这可能很危险。
在这个示例中,我建议从 aunique_ptr
而不是 bare开始new
。这样可以确保跟踪整个生命周期。
#include <memory>
int main(int argc, char **argv) {
auto m = std::make_unique<method>();
insert(1, std::move(m));
}
在insert
您还可以使用std::move
将所有权转移到集合。
推荐阅读
- scala - 如何使用 scala 在路由上绑定枚举?
- ios - 提高 VNDetectHumanBodyPoseRequest 的身体跟踪性能
- javascript - For 循环、异步等待、承诺 - Javascript
- python-3.x - 从附加到连接方法的选择方法中的列列表中转换列
- ios - iOS 12 未显示蓝牙权限
- php - 在 laravel 项目 Stripe\Exception\ApiConnectionException 上连接条带 api 时出错
- arrays - 如何将 JSON 嵌套数组放入 React 中的依赖选择列表中
- angular - 用 Apollo 的内存缓存替换 ngrx 的存储作为我的单一事实来源
- scala - ConstantInputDStream.print() 什么都不做
- drake - 与多体植物的直接搭配/直接转录