#pragma once #include #include #include namespace orange { template class Variant { public: static constexpr size_t MaxElementSize = Max({sizeof(Types)...}); static constexpr size_t Alignment = Max({alignof(Types)...}); explicit Variant() { } template Variant(Args&&... args) { Construct(Forward(args)...); } template void Construct(Args&&... args) { new (Ptr()) T(Forward(args)...); } template void Destruct() { Ptr()->~T(); } void Clear() { std::memset(&data, 0, sizeof(data)); } template T* Ptr() { return reinterpret_cast (data.data); } template const T* Ptr() const { return reinterpret_cast(data.data); } template T& Get() { return *Ptr(); } template const T& Get() const { return *Ptr(); } private: AlignedStorage data; }; }