在std容器中使用unique_ptr是否有透明的方法?

Kon*_*ele 2 c++ stdmap unique-ptr c++17

是否有透明的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;                                                                                                                               
}   
Run Code Online (Sandbox Code Playgroud)

我想使用tbl.insert({id,m});tbl[id] = m;等,而不必为每次访问包装/解包.

  • 是否有unique_ptr的std容器实现?特别是std::map.
  • 如何实现透明界面?

Dre*_*ins 10

通常,我们不想隐式创建,std::unique_ptr因为这可能是危险的.

在这个例子中,我建议从一个unique_ptr而不是裸露开始new.这可确保跟踪整个生命周期.

#include <memory>
int main(int argc, char **argv) {
    auto m = std::make_unique<method>();
    insert(1, std::move(m));
}
Run Code Online (Sandbox Code Playgroud)

insert还可以使用std::move将所有权转让给集合.