title: Packet wrangling from C to C++ or... how Neither Variant nor Any is a Union
body: <p>The problem in a nutshell: I'm considering a rewrite of some packet handling code for a UDP protocol ... from C to C++.  Obviously, I can just use the structures that I had with C to model the data,  but then what would be the point?  So, for the sake of argument, we have:</p>
  
  <pre><code>struct { uint8:2 type; uint8:6 con_id; uint16 seq_num } packet_header;
  struct { packet_header ph; uint16 command; } control_packet;
  struct { packet_header ph; uchar8 data[DATASIZE]; } data_packet;
  </code></pre>
  
  <p>In this case, "type" is 0 for data, 1 for control, 2 for encrypted data and 3 for encrypted control.  There would also be structs reprenting each of the control packets, for argument, lets say "open" and "close".</p>
  
  <p>Now... I would normally have a type that the function that fetches the packet returns and the function that sends accepts:</p>
  
  <pre><code>struct {
    size_t pkt_len;
    union {
      uchar8 raw_packet[DATASIZE];
      packet_header ph;
      control_packet cp;
      control_open_packet cop;
      control_close_packet ccp;
      data_packet dp; 
    } p; 
  } packet;
  </code></pre>
  
  <p>... this is all simplified for argument... but the point is: when sending a packet, we want to create a packet of a certain type and send a generic packet.  Conversely, when receiving a packet, you want to receive a generic packet and and cast it to more specific types as you classify it.</p>
  
  <p>So where's the question?  My question is: if Variant and Any are not appropriate ways to express this, what are?  Am I stuck with union in this case?  Certainly I don't violate the stipulation of POD types (so far) for the union.  I've been scouring both C++11 and Boost (and to some extent looking at C++14 ... although I'm stuck with C++11) and I don't see offered solutions.</p>