variantを使うとまさに「複数の型の値を持ち得る型」を宣言できる
取り得る型をT,U,...とするとvariant<T,U,...> data;のように宣言すればよい

variantの実装はboostにあるから自分で調べて