使用 operator[] 访问 unique_ptr 的私有 std::map
Using operator[] to access a private std::map of unique_ptr
我有一个 class,私人 std::map 为 unique_ptr:
class MyClass{
std::map <KeyType, std::unique_ptr<my_type>> my_map;
...
};
我选择 unique_ptr 因为 my_map 是 my_type 个对象的唯一所有者。
我想公开一个operator[] public成员函数来访问(完美转发)my_map。
类似于:
// my_class is of type MyClass
auto ptr = my_type_factory(...); // my_type_factory returns a std::unique_ptr<my_type>
....
my_class[1] = std::move(auto_ptr);
我尝试了 operator[] 的各种可能定义:
class MyClass{
....
public:
auto operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; }
// or return & my_map[...];
};
但是不行,最后我总是调用unique_ptr的删除拷贝构造函数。
为了继续前进,如果我将 my_map 移动到 public 接口,我已经通过了所有测试,但这当然是作弊,因为我正在尝试完善我的现代 C++技能,我认为有一些原则我还没有用 unique_ptr 和 move.
所以我的问题是:如何在私人 std::map 中使用 std::unique_ptr?
你应该return一个参考。
auto & operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; }
我有一个 class,私人 std::map 为 unique_ptr:
class MyClass{
std::map <KeyType, std::unique_ptr<my_type>> my_map;
...
};
我选择 unique_ptr 因为 my_map 是 my_type 个对象的唯一所有者。
我想公开一个operator[] public成员函数来访问(完美转发)my_map。 类似于:
// my_class is of type MyClass
auto ptr = my_type_factory(...); // my_type_factory returns a std::unique_ptr<my_type>
....
my_class[1] = std::move(auto_ptr);
我尝试了 operator[] 的各种可能定义:
class MyClass{
....
public:
auto operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; }
// or return & my_map[...];
};
但是不行,最后我总是调用unique_ptr的删除拷贝构造函数。
为了继续前进,如果我将 my_map 移动到 public 接口,我已经通过了所有测试,但这当然是作弊,因为我正在尝试完善我的现代 C++技能,我认为有一些原则我还没有用 unique_ptr 和 move.
所以我的问题是:如何在私人 std::map 中使用 std::unique_ptr?
你应该return一个参考。
auto & operator[](KeyType && key) { return my_map[std::forward<KeyType>(key)]; }