1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | struct variant{
  union U { A a; B b; C c; /*char dummy[max_sizeof<A,B,C>()]; U():dummy(){}*/ } u;
  static constexpr unsigned noindex = -1u;
  unsigned idx = noindex;
 
  template<class T>
  variant(T && x)
  {
     new (u.a) std::decay_t<T>(std::forward<T>(x));
     idx = get_idx<T>();
  }
 
  ~variant()
  {
     if (idx != noindex) {
       visit([](auto & x) { 
         using T = decltype(x);
         x.~T();
       });
     }
  }
 
  template<class Fn>
  void visit(Fn fn) {
    switch(idx) {
      case 0: fn(u.a); break;
      case 1: fn(u.b); break;
      case 2: fn(u.c); break;
      default: ;
    }
  }
}; | 
Partager