Есть функция, возвращающая 32-разрядное интегральное значение (int, long и т.п.), и определена упакованная структура того же размере (например, два short). Присвоить значение переменной структуры несложно, достаточно лишь взять указатель на структуру, преобразовать его в указатель интегрального типа, и разыменовать.
Хочется таким же манером (в одно действие) инициализировать переменную структуры. Но MS VC++ 15.00 и 19.10 напрочь отказывается преобразовывать интегральное значение к типу структуры, ссылаясь на отсутствие подходящего конструктора. Удается вывернуться лишь взятием и преобразованием указателя на функцию, с вызовом ее через этот указатель.
Есть ли возможность преобразовать тип при инициализации более кошерными методами?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть функция, возвращающая 32-разрядное интегральное значение (int, long и т.п.), и определена упакованная структура того же размере (например, два short).
ЕМ>Присвоить значение переменной структуры несложно, достаточно лишь взять указатель на структуру, преобразовать его в указатель интегрального типа, и разыменовать.
Тем самым на ровном месте нарушив strict aliasing rule и сделав поведение программы неопределённым. Очень плохой способ! Используй std::bit_cast или реализуй его аналог через memcpy.
ЕМ>Есть ли возможность преобразовать тип при инициализации более кошерными методами?
Написать и предоставить конструктор, разумеется :)
Re[2]: Преобразование интегрального значения к типу структуры при инициализации
Здравствуйте, watchmaker, Вы писали:
W>Тем самым на ровном месте нарушив strict aliasing rule и сделав поведение программы неопределённым.
Я Вас умоляю! Это используется во множестве программ, и прекрасно контролируется. Когда я стану делать программы для заранее неизвестного железа и компилятора — буду этим заморачиваться, но не сейчас.
W>Написать и предоставить конструктор, разумеется
Структуры определены не мной. Можно, конечно, создать производный/отдельный тип и определить для него конструктор, но это уже как-то громоздко.
Re[3]: Преобразование интегрального значения к типу структур
Евгений Музыченко:
W>>Написать и предоставить конструктор, разумеется
ЕМ>Структуры определены не мной. Можно, конечно, создать производный/отдельный тип и определить для него конструктор, но это уже как-то громоздко.
Можно просто сделать отдельные функции для преобразования туда и обратно. Внутри сможешь использовать хоть гарантированно рабочие решения, хоть хаки, потом можно будет поправить в случае чего.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Хочется таким же манером (в одно действие) инициализировать переменную структуры. Но MS VC++ 15.00 и 19.10 напрочь отказывается преобразовывать интегральное значение к типу структуры, ссылаясь на отсутствие подходящего конструктора.
Все прекрасно преобразуется и безо всяких кастомных конструкторов: