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

Сообщение Re[5]: initializer_list и неизвестная размерность от 25.11.2020 20:33

Изменено 25.11.2020 20:48 rg45

Re[5]: initializer_list и неизвестная размерность
Здравствуйте, ArtDenis, Вы писали:

AD>Если уж придирки продолжились и с учётом того, что скорее всего Tree будет использоваться только при инициализации (как тип аргумента функции инициализации), то можно уменьшить потребление памяти и количество алокаций:


AD>
AD>struct Tree
AD>{
AD>    std::variant<std::vector<Tree>, std::initializer_list<int>> val_;
AD>    Tree(std::initializer_list<int> children) : val_(children) {}
AD>    Tree(std::initializer_list<Tree> children) : val_(children) {}
AD>};
AD>


Если так, то не очень понятно, для чего здесь нужен std::vector. Можно ведь полностью перейти на std::initializer_list. Ну и параметризация initializer_list двумя разными типами, с моей точки зрения выглядит как не очень оправданное усложнение кода. Ведь initializer_list — это всего лишь пара указателей для которых не нужно никаких аллокаций и копирования контента они за собой не влекут. Я бы переписал так:

template <typename T>
struct Tree
{
    std::variant<int, std::initializer_list<Tree>> val_;
    Tree() = default;
    Tree(const T& v) : val_(v) {}
    Tree(std::initializer_list<Tree> children) : val_(children) {}
};
Re[5]: initializer_list и неизвестная размерность
Здравствуйте, ArtDenis, Вы писали:

AD>Если уж придирки продолжились и с учётом того, что скорее всего Tree будет использоваться только при инициализации (как тип аргумента функции инициализации), то можно уменьшить потребление памяти и количество алокаций:


AD>
AD>struct Tree
AD>{
AD>    std::variant<std::vector<Tree>, std::initializer_list<int>> val_;
AD>    Tree(std::initializer_list<int> children) : val_(children) {}
AD>    Tree(std::initializer_list<Tree> children) : val_(children) {}
AD>};
AD>


Если так, то не очень понятно, для чего здесь нужен std::vector. Можно ведь полностью перейти на std::initializer_list. Ну и параметризация initializer_list двумя разными типами, с моей точки зрения выглядит как не очень оправданное усложнение кода. Ведь initializer_list — это всего лишь пара указателей для которых не нужно никаких аллокаций и копирования контента они за собой не влекут. Я бы переписал так:

template <typename T>
struct Tree
{
    std::variant<T, std::initializer_list<Tree>> val_;
    Tree() = default;
    Tree(const T& v) : val_(v) {}
    Tree(std::initializer_list<Tree> children) : val_(children) {}
};