Сообщение Re[5]: initializer_list и неизвестная размерность от 25.11.2020 20:33
Изменено 25.11.2020 20:52 rg45
Re[5]: initializer_list и неизвестная размерность
Здравствуйте, ArtDenis, Вы писали:
AD>Если уж придирки продолжились и с учётом того, что скорее всего Tree будет использоваться только при инициализации (как тип аргумента функции инициализации), то можно уменьшить потребление памяти и количество алокаций:
AD>
Если так, то не очень понятно, для чего здесь нужен std::vector. Можно ведь полностью перейти на std::initializer_list. Ну и параметризация initializer_list двумя разными типами, с моей точки зрения выглядит как не очень оправданное усложнение кода. Ведь initializer_list — это всего лишь пара указателей для которых не нужно никаких аллокаций и копирования контента они за собой не влекут. Я бы переписал так:
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>
Если так, то не очень понятно, для чего здесь нужен std::vector. Можно ведь полностью перейти на std::initializer_list. Ну и параметризация initializer_list двумя разными типами, с моей точки зрения выглядит как не очень оправданное усложнение кода. Ведь initializer_list — это всего лишь пара указателей для которых не нужно никаких аллокаций и копирования контента они за собой не влекут. Я бы переписал так:
И я даже пошел бы дальше, не постеснявшись использовать наследование. Имхо, в данном случае наследование вполне естественно и дает сразу готовый к использованию класс:
http://coliru.stacked-crooked.com/a/2ea221fe95d122df
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) {}
};