13 template <
typename T,
typename... ARGS>
20 constexpr StorageImpl_ () noexcept
24 StorageImpl_ (
const StorageImpl_&) =
delete;
25 StorageImpl_& operator= (
const StorageImpl_&) =
delete;
26#if __has_cpp_attribute(msvc::noop_dtor)
33 static once_flag sFlag_{};
34 static StorageImpl_ sStorage_{};
35 call_once (sFlag_, [&] () { ::new (&sStorage_) T{args...}; });
36 return reinterpret_cast<T&
> (sStorage_);
40 template <
typename VariantType,
typename T, std::
size_t index = 0>
41 constexpr std::size_t variant_index ()
44 static_assert (std::variant_size_v<VariantType> > index,
"Type not found in variant");
45 if constexpr (index == std::variant_size_v<VariantType>) {
48 else if constexpr (std::same_as<std::variant_alternative_t<index, VariantType>, T>) {
52 return variant_index<VariantType, T, index + 1> ();
56 template <
typename VARIANT_VALUE,
typename T>
57 constexpr size_t VariantIndex = Private_::variant_index<VARIANT_VALUE, T> ();
T & Immortalize(ARGS... args)