Size: a a a

2021 February 08

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Не очень понимаю, почему для полиморфных?
Ну вот заметь, что Value : Node не обязан быть мономорфным
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Ну вот заметь, что Value : Node не обязан быть мономорфным
Ну это ж для интрузивных только, при чём тут std?
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну это ж для интрузивных только, при чём тут std?
Ну так у тебя будет интрузивная обёртка в любом случае. Или не сойдётся? Хм.
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Ну так у тебя будет интрузивная обёртка в любом случае. Или не сойдётся? Хм.
В std будет агрегат Node { Value value; }. Без интрузивности.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
В std будет агрегат Node { Value value; }. Без интрузивности.
А структуру где хранить?
источник

CD

Constantine Drozdov in pro.cxx
Я что-то не вижу пути, кроме вышеуказанного. Что я понял, так это что надо будет делать что-то вроде
template <typename T>
struct value : node {
   alignas(std::max_align_t) T value;
};
источник

MK

Mikhail Kalugin in pro.cxx
И тут вопрос на засыпку. Как отличить лист от узла если структура - указатель на один из них.
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Я что-то не вижу пути, кроме вышеуказанного. Что я понял, так это что надо будет делать что-то вроде
template <typename T>
struct value : node {
   alignas(std::max_align_t) T value;
};
Ну да, как то так. А зачем alignas?
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну да, как то так. А зачем alignas?
Ну вроде бы без этого нельзя перекастовать struct { Derived } в struct { Base }
источник

CD

Constantine Drozdov in pro.cxx
А с этим можно, только незаконно :)
источник

CD

Constantine Drozdov in pro.cxx
Хм... или это не важно? Вроде важно
источник

D

Dmitriy in pro.cxx
Constantine Drozdov
Ну вроде бы без этого нельзя перекастовать struct { Derived } в struct { Base }
max_align_t
Опасно выглядит
источник

D

Dmitriy in pro.cxx
Выравнивание T формально может быть любым...
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Ну вроде бы без этого нельзя перекастовать struct { Derived } в struct { Base }
А и не требуется нигде. Итератор держит указатель на node и каст в value_node всегда валиден если это не end который чистый node. А для end разыменование ub.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
А и не требуется нигде. Итератор держит указатель на node и каст в value_node всегда валиден если это не end который чистый node. А для end разыменование ub.
Это в мономорфной версии, а в полиморфной тебе нужен какой-то более лучший аналог структуры в конце которой хранилище для  value, и может не пойти
источник

CD

Constantine Drozdov in pro.cxx
С оверхедом вроде бы просто
struct node { node*; node*; };
struct value_base : node { Base &; //локальная };
template <typename Derived> struct polymorphic : value_base { Derived value; polymorphic() : value_base(value) {} };
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Это в мономорфной версии, а в полиморфной тебе нужен какой-то более лучший аналог структуры в конце которой хранилище для  value, и может не пойти
Полиморфная версия это типа list<any> или list<variant>? Не понимаю пока как использовать.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Полиморфная версия это типа list<any> или list<variant>? Не понимаю пока как использовать.
list<any_child_of<Base>>
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
list<any_child_of<Base>>
Тут сложности будут с аллокатором ибо их тьма.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Тут сложности будут с аллокатором ибо их тьма.
Так там и так rebind, причем обязательный
источник