diff --git a/include/continuable/detail/variant.hpp b/include/continuable/detail/variant.hpp index 985de2c..6a33136 100644 --- a/include/continuable/detail/variant.hpp +++ b/include/continuable/detail/variant.hpp @@ -46,8 +46,7 @@ namespace variant { namespace detail { // We don't want to pull the algorithm header in template -constexpr std::size_t max_size(T... i) { - constexpr std::initializer_list const list{i...}; +constexpr std::size_t max_element_of(std::initializer_list list) { std::size_t m = 0; for (auto current : list) { if (current > m) { @@ -56,11 +55,16 @@ constexpr std::size_t max_size(T... i) { } return m; } +template +constexpr std::size_t storage_of_impl() { + constexpr auto size = max_element_of({sizeof(T)...}); + constexpr auto align = max_element_of({alignof(T)...}); + return std::aligned_storage_t{}; +} /// Declares the aligned storage union for the given types template -using storage_of_t = - std::aligned_storage_t; +using storage_of_t = decltype(storage_of_impl()); /// The value fpr the empty slot using slot_t = std::uint8_t; @@ -257,20 +261,20 @@ public: template V& cast() noexcept { - assert(!is_slot(traits::index_of_t, T...>::value)); + assert(is_slot(traits::index_of_t, T...>::value)); return *reinterpret_cast*>(&this->storage_); } template V const& cast() const noexcept { - assert(!is_slot(traits::index_of_t, T...>::value)); + assert(is_slot(traits::index_of_t, T...>::value)); return *reinterpret_cast const*>(&this->storage_); } private: template static void visit_dispatch(optional_variant* me, V&& visitor) { - std::forward(me->cast()); + std::forward(visitor)(me->cast()); } template static void visit_dispatch_const(optional_variant const* me, V&& visitor) { diff --git a/test/playground/test-playground.cpp b/test/playground/test-playground.cpp index 18aada0..646dae3 100644 --- a/test/playground/test-playground.cpp +++ b/test/playground/test-playground.cpp @@ -177,5 +177,12 @@ int main(int, char**) { }); - variant::optional_variant v; + { + variant::optional_variant var; + + var = 1; + var = 1.f; + } + + int i = 0; }