Сообщение Re[2]: другой Вопрос по стандартному unique_ptr от 18.07.2023 12:45
Изменено 18.07.2023 12:54 Sm0ke
Re[2]: другой Вопрос по стандартному unique_ptr
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Sm0ke, Вы писали:
S>>
R>Да, жалко, но, в принципе, решается через типы более высокого уровня, которые инкапсулируют внутри себя умные указатели:
R>
Понятно. Так делать неудобно.
Приватные члены => следует определить copy и move конструкторы, операторы присвоения (всю эту шнягу нагромождение кода).
Замедление компиляции на ровном месте.
p.s: Кстати, зачем тут вы использовали piecewise_construct с туплами? Тут же можно и без них...
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>>
R>Да, жалко, но, в принципе, решается через типы более высокого уровня, которые инкапсулируют внутри себя умные указатели:
R>
Понятно. Так делать неудобно.
p.s: Кстати, зачем тут вы использовали piecewise_construct с туплами? Тут же можно и без них...
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");
}