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

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

Изменено 25.11.2020 20:52 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<T, 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) {}
};


И я даже пошел бы дальше, не постеснявшись использовать наследование. Имхо, в данном случае наследование вполне естественно и дает сразу готовый к использованию класс:

http://coliru.stacked-crooked.com/a/2ea221fe95d122df

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