Информация об изменениях

Сообщение Re[2]: другой Вопрос по стандартному unique_ptr от 18.07.2023 12:45

Изменено 18.07.2023 12:54 Sm0ke

Re[2]: другой Вопрос по стандартному unique_ptr
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Sm0ke, Вы писали:


S>>
S>>v_map.try_emplace(true, std::in_place_type<some_type>); // Жалко, что так нельзя!
S>>


R>Да, жалко, но, в принципе, решается через типы более высокого уровня, которые инкапсулируют внутри себя умные указатели:


R>
R>class Outer
R>{
R>public:
  
R>    Outer(int i, double d, const std::string& s)
R>        : m_inner(std::make_unique<Inner>(i, d, s)) { }

R>private:
R>    struct Inner
R>    {
R>        int i{};
R>        double d{};
R>        std::string s{};
R>   };

R>   std::unique_ptr<Inner> m_inner;
R>};


R>void foo()
R>{
R>    std::map<int, Outer> m;
    
R>    m.emplace(
R>        std::piecewise_construct,
R>        std::forward_as_tuple(1),
R>        std::forward_as_tuple(42, 3.14, "Hello")
R>    );
R>}
R>


Понятно. Так делать неудобно.
Приватные члены => следует определить copy и move конструкторы, операторы присвоения (всю эту шнягу нагромождение кода).
Замедление компиляции на ровном месте.

p.s: Кстати, зачем тут вы использовали piecewise_construct с туплами? Тут же можно и без них...

void foo()
{
    std::map<int, Outer> m;
    
    m.try_emplace(1, 42, 3.14, "Hello");
}
Re[2]: другой Вопрос по стандартному unique_ptr
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Sm0ke, Вы писали:


S>>
S>>v_map.try_emplace(true, std::in_place_type<some_type>); // Жалко, что так нельзя!
S>>


R>Да, жалко, но, в принципе, решается через типы более высокого уровня, которые инкапсулируют внутри себя умные указатели:


R>
R>class Outer
R>{
R>public:
  
R>    Outer(int i, double d, const std::string& s)
R>        : m_inner(std::make_unique<Inner>(i, d, s)) { }

R>private:
R>    struct Inner
R>    {
R>        int i{};
R>        double d{};
R>        std::string s{};
R>   };

R>   std::unique_ptr<Inner> m_inner;
R>};


R>void foo()
R>{
R>    std::map<int, Outer> m;
    
R>    m.emplace(
R>        std::piecewise_construct,
R>        std::forward_as_tuple(1),
R>        std::forward_as_tuple(42, 3.14, "Hello")
R>    );
R>}
R>


Понятно. Так делать неудобно.

p.s: Кстати, зачем тут вы использовали piecewise_construct с туплами? Тут же можно и без них...

void foo()
{
    std::map<int, Outer> m;
    
    m.try_emplace(1, 42, 3.14, "Hello");
}