Der richtige Weg, um alias Wertdarstellungen ist fast immer memcpy
zu verwenden:
std::array<T, k> my_t;
static_assert(sizeof(my_t) == sizeof(my_u), "!!");
std::memcpy(my_t.data(), &my_u, sizeof(my_u));
Es gibt keine „schöner“ Art und Weise, wie Sie memcpy
an einem gewissen Punkt verwenden, müssen strenge Aliasing Beschränkungen umgehen (es sei denn, T
ist ein schmaler Zeichentyp).
Zur Kompilierzeit ist dies im Allgemeinen unmöglich, da der C++ Standard z. Beschreiben Sie das Layout von Bits innerhalb von Fließkommatypen oder ob ganzzahlige Typen Little-, Big- oder Mixed-Endian sind. Dies ist möglicherweise in einigen eingeschränkten Instanzen möglich, aber Sie können memcpy
oder reinterpret_cast
nicht verwenden, daher müssen Sie typspezifischen Code schreiben, um einzeln auf die Mitglieder von U
zuzugreifen.
Der beste Weg, um Ihren Code strukturieren könnte sein, eine Sammlung von Funktionen zu schreiben, Werte vom Typ T
von einem Wert vom Typ U
bei einem spezifischen extra Offset:
constexpr T getValueOfTAtOffset(U u, std::integral_constant<std::size_t, 0>) { ... }
constexpr T getValueOfTAtOffset(U u, std::integral_constant<std::size_t, 1>) { ... }
// ...
Sie würden sie rufen Sie dann ein index_sequence
mit Schabloneninferenz:
template<std::size_t... I>
constexpr std::array<T, sizeof...(I)> asArrayOfTImpl(U u, std::integer_sequence<std::size_t, I...>) {
return {getValueOfTAtOffset(u, std::integral_constant<std::size_t, I>{})};
}
constexpr std::array<T, k> asArrayOfT(U u) {
return asArrayOfTImpl(u, std::make_index_sequence<k>{});
}
Warum willst du das? – GManNickG
Sound viel wie ein Bitfield oder vielleicht sogar eine Union. –
Nicht möglich; Sie können zur Kompilierungszeit nicht 'interpretieren'. – ecatmur