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