конструктор от первого поля или побитам?
Копи ктор первого поля. Если он тривиальный, компилятор может бахнуть memcpy где имеет смысл
Т.е. может быть union union_t { bool first; double second; } union_t func(){ union_t uni; uni.second = 1.0; return uni; } ... auto res = func(); res.second // 0.0
А зачем использовать юнионы?
Озадачил. Ждем Влада
Чтобы пустые поля не делать, все равно только одно значение может быть. Но я думаю здесь намек на variant.
Да. Сырой union - злющее зло
А variant больше памяти жрет? Просто не смотрел его реализацию
Он жрёт память минимально возможное количество для его реализации. sizeof() наибольшего поля + sizeof() для индекса типа активного типа + выравнивание
Плохо( нужно минимум памяти. Так как это используется в векторах длина которых экспоненциальна, а таких нод до 2,5млн. И тип определяется один на вектор, поэтому нет смысла хранить тип в каждом обьекте
variant<vector<double>, vector<int>, ...>
Тогда я не смогу перевести один тип в другой без копирования вектора(выделения новой памяти)
Что значит "перевести"? variant<vector<int>, vector<double>> - это по сути или вектор целых чисел, или вектор double'ов. Что и куда нужно переводить? Не понимаю
Мне нужно bool и double. И возможность перевести из bool в double. Если bool = false : double =0.0. Если bool = true : double = 1.0
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Хм. Но зачем? Если нужно работать с этим вектором как с честным массивом каких-то значений, то имеет смысл хранить всегда double, а интерфейс уже сделать удобным. Т.е. ничего не мешает конвертировать double -> bool на лету, при обращении.
Если ты опишешь задачу чуть подробнее, возможно придумаем решение получше
Так и было раньше, но мне показалось что с разделением будет лучше, не будет 0.9999 и т п.
Если класть в double ровно единицу, она там и будет лежать
Ладно, сделаю на чистом double, спасибо
Блин, вот это вопрос... Я кажется ни разу в жизни юнион не возвращал из фукнции... Объекты с юнионом - да, бывало, а вот так вот чтоб голый UNION...
Для этого не нужен юнион, для этого нужно преобразование типа.
если все члены union тривиально копируемы, то он побайтово копируется, и те объекты, которые были «живы» в исходном union, «оживают» в копии. «объекты» во множественном числе, потому что это применяется рекурсивно ко всем подобъектам http://eel.is/c++draft/class.copy.ctor#15 http://eel.is/c++draft/class.union#general-note-3 если что-то не копируется тривиально, то нужно писать это руками
меня стоит звать через @, потому что добрую половину этого чата я проматываю (если это про меня)
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
поправил первую ссылку на стандарт
Обсуждают сегодня