Mon programme reçoit des messages sur le réseau. Ces messages sont désérialisé par certains middleware (c'est à dire quelqu'un d'autre code que je ne peux pas changer). Mon programme reçoit des objets qui ressemblent à quelque chose comme ceci:
struct Message {
int msg_type;
std::vector<uint8_t> payload;
};
En examinant msg_type
je peux déterminer que la charge utile du message est en fait, par exemple, un tableau de uint16_t
valeurs. Je voudrais lire ce tableau sans une copie superflue.
Ma première pensée a été pour ce faire:
const uint16_t* a = reinterpret_cast<uint16_t*>(msg.payload.data());
Mais alors la lecture à partir d' a
semble violer la norme. Voici la clause 3.10.10:
Si un programme tente d'accéder à la valeur d'un objet par l'intermédiaire d'un glvalue d'autre que l'un des types suivants le comportement est indéfini:
- le type dynamique de l'objet,
- un cv qualifiés version du type dynamique de l'objet,
- un type similaire (tel que défini dans la section 4.4) pour le type dynamique de l'objet,
- un type qui est signé ou non signé de type correspondant au type dynamique de l'objet,
- un type qui est signé ou non signé de type correspondant à un cv qualifiés version du type dynamique de l'objet,
- une agrégation ou une union de type qui comprend l'un des types mentionnés ci-dessus entre ses éléments, ou non membres de données (y compris, de manière récursive, un élément ou d'un non-membre de données statiques d'un subaggregate ou contenus de l'union),
- un type qui est une (peut-être de cv qualifiés) de la classe de base de type de le type dynamique de l'objet,
- un
char
ouunsigned char
type.
Dans ce cas, a
serait le glvalue et uint16_t*
ne semble pas satisfait à aucun des critères énumérés.
Alors, comment dois-je traiter la charge utile, comme un tableau d' uint16_t
valeurs sans avoir recours à un comportement indéfini ou de l'exécution d'une copie superflue?