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

Сообщение Re[6]: initializer_list и неизвестная размерность от 25.11.2020 21:12

Изменено 27.11.2020 11:31 Bill Baklushi

Re[6]: initializer_list и неизвестная размерность
rg45:

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


Мой вариант https://rsdn.org/forum/cpp/7890246.1
Автор: Bill Baklushi
Дата: 25.11.20
запрещает смешивание Tree и int в пределах одного уровня
    Tree(std::initializer_list<int> children) : val_(children) {}
    Tree(std::initializer_list<Tree> children) : val_(children) {}

Но сочетание разной глубины int не запрещает.

Меня всё мучают подозрения, что это можно реализовать на шаблонах, но как, ума не приложу.

Для практических целей вполне сойдёт вариант фиксированной глубины без шаблонов
std::variant<
  std::initializer_list<int>,
  std::initializer_list<std::initializer_list<int>>,
  std::initializer_list<std::initializer_list<std::initializer_list<int>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>>>
  >



А вот в мировом масштабе без потери общности...
Re[6]: initializer_list и неизвестная размерность
rg45:

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


Мой вариант https://rsdn.org/forum/cpp/7890246.1
Автор: Bill Baklushi
Дата: 25.11.20
запрещает смешивание Tree и int в пределах одного уровня
    Tree(std::initializer_list<int> children) : val_(children) {}
    Tree(std::initializer_list<Tree> children) : val_(children) {}

Но сочетание разной глубины int не запрещает.

Меня всё мучают подозрения, что это можно реализовать на шаблонах, но как, ума не приложу.

Для практических целей вполне сойдёт вариант фиксированной глубины без шаблонов
std::variant<
  std::initializer_list<int>,
  std::initializer_list<std::initializer_list<int>>,
  std::initializer_list<std::initializer_list<std::initializer_list<int>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>>,
  std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<int>>>>>>
  >


(UPD это, окажывается не работает)

А вот в мировом масштабе без потери общности...