Denis Yaroshevskiy
          
template <typename ...Ts>
struct variant {
  union { Ts ... elems; } data;
  index_type idx;
};
auto visit(auto&& vis, auto&& ... vs) {
  switch ( ... )  {
    case 0: return vis(get<0>(vs) ....);
    case 1: ...
    ...
  }
};