diff --git a/alib2std/src/extensions/container/variant.hpp b/alib2std/src/extensions/container/variant.hpp index 96f9f9c7011828fdc4d0f8a9c8f6fbb84f16cc12..cc0cc61da731551bc80fd110038b7bfc1b446090 100644 --- a/alib2std/src/extensions/container/variant.hpp +++ b/alib2std/src/extensions/container/variant.hpp @@ -41,7 +41,7 @@ namespace ext { template < class Visitor, class... Variants > constexpr auto visit ( Visitor && vis, Variants && ... vars ) { auto extToStd = [] ( auto && variant ) { - using __std__variant = typename std::decay_t < decltype ( variant ) >::__std__variant; + using __std__variant = typename std::decay_t < decltype ( variant ) >::__base; if constexpr ( std::is_lvalue_reference_v < decltype ( variant ) > && std::is_const_v < std::remove_reference_t < decltype ( variant ) > > ) { return static_cast < const __std__variant & > ( variant ); @@ -56,6 +56,7 @@ constexpr auto visit ( Visitor && vis, Variants && ... vars ) { return std::visit ( std::forward < Visitor > ( vis ), extToStd ( std::forward < Variants > ( vars ) ) ... ); } + /** * \brief * Class to help building of the variant type or, in case variant is requested to be constructed from single type or more types but all the same, that concrete type. @@ -77,11 +78,6 @@ struct variant_builder_impl { template < class ... ResTs > struct variant_builder_impl < std::variant < ResTs ... > > : public std::variant < ResTs ... > { typedef std::variant < ResTs ... > __std__variant; - - /** - * Inherit constructors of the standard variant - */ - using std::variant < ResTs ... >::variant; // NOLINT(modernize-use-equals-default) }; /** @@ -94,20 +90,15 @@ struct variant_builder_impl < std::variant < ResTs ... > > : public std::variant */ template < class ... ResTs, class T, class ... Ts > struct variant_builder_impl < std::variant < ResTs ... >, T, Ts ... > : public variant_builder_impl < typename std::conditional < is_in < T, ResTs ... >::value, std::variant < ResTs ... >, std::variant < ResTs ..., T > >::type, Ts ... > { - /** - * Inherit constructors of the standard variant - */ - using variant_builder_impl < typename std::conditional < is_in < T, ResTs ... >::value, std::variant < ResTs ... >, std::variant < ResTs ..., T > >::type, Ts ... >::variant_builder_impl; // NOLINT(modernize-use-equals-default) }; template < class T, class ... Ts > struct variant_builder_start : public variant_builder_impl < std::variant < T >, Ts ... > { - /** - * Inherit constructors of the standard variant - */ - using variant_builder_impl < std::variant < T >, Ts ... >::variant_builder_impl; // NOLINT(modernize-use-equals-default) }; +template < class ... Ts > +using __std__variant = typename variant_builder_start < Ts ... >::__std__variant; + /** * \brief * Implementation of the variant class allowing to store any type of those listed in the template parameters. Void type is allowed, multiply specified same type is irrelevant. @@ -115,7 +106,7 @@ struct variant_builder_start : public variant_builder_impl < std::variant < T >, * \tparam Ts ... pack of allowed types. */ template < typename ... Ts > -class variant : public variant_builder_start < Ts ... > { +class variant : public __std__variant < Ts ... > { /** * Internal variant to string callback implementation. */ @@ -216,15 +207,20 @@ class variant : public variant_builder_start < Ts ... > { } }; public: + /** + * Remember the base class, i.e. std::variant + */ + typedef __std__variant < Ts ... > __base; + /** * Inherit constructors of the standard variant */ - using variant_builder_start < Ts ... >::variant_builder_start; // NOLINT(modernize-use-equals-default) + using __std__variant < Ts ... >::__std__variant; // NOLINT(modernize-use-equals-default) /** * Inherit operator = of the standard variant */ - using variant_builder_start < Ts ... >::__std__variant::operator=; + using __std__variant < Ts ... >::operator=; #ifndef __clang__ /**