首页 > 解决方案 > 是否有在 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;,而不必为每次访问打包/解包。

标签: c++c++17unique-ptrstdmap

解决方案


通常,我们不想隐式创建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将所有权转移到集合。


推荐阅读