#pragma once namespace variant { namespace detail { template struct helper; template struct helper { inline static void destroy(size_t id, void * data) { if (id == sizeof...(Ts)) { reinterpret_cast(data)->~F(); } else { helper::destroy(id, data); } } inline static void move(size_t old_t, void * old_v, void * new_v) { if (old_t == sizeof...(Ts)) { new (new_v) F(std::move(*reinterpret_cast(old_v))); } else { helper::move(old_t, old_v, new_v); } } inline static void copy(size_t old_t, const void * old_v, void * new_v) { if (old_t == sizeof...(Ts)) { new (new_v) F(*reinterpret_cast(old_v)); } else { helper::copy(old_t, old_v, new_v); } } }; template <> struct helper<> { inline static void destroy(size_t, void *) {} inline static void move(size_t, void *, void *) {} inline static void copy(size_t, const void *, void *) {} }; }}