diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index 112d100f89cc834c83d3c6f5647df4dea1baba26..25c1907e05e564fee316eefbb3c441cbbd7fd11e 100644 --- a/alib2std/src/extensions/variant.hpp +++ b/alib2std/src/extensions/variant.hpp @@ -157,6 +157,8 @@ protected: public: variant_base(const F& value) : variant_base<ST, AT, Ts...>::variant_base ( typeid(F).hash_code() ) { new (&this->data) F(value); } variant_base(F&& value) : variant_base<ST, AT, Ts...>::variant_base ( typeid(F).hash_code() ) { new (&this->data) F(std::move(value)); } + + variant_base() : variant_base<ST, AT, Ts ... >::variant_base ( ) { } }; template<typename ST, typename AT, typename... Ts> @@ -304,12 +306,12 @@ public: } template < typename T > - static typename std::enable_if < std::is_base_of_any<T, Ts...>::value && ! std::is_same < void, T >::value, variant < Ts ... > >::type from ( ) { - return variant < Ts ... >( T ( ) ); + static typename std::enable_if < ! std::is_same < void, T >::value, variant < Ts ... > >::type from ( ) { + return variant < Ts ... >( T { } ); } template < typename T > - static typename std::enable_if < std::is_base_of_any<T, Ts...>::value && std::is_same < void, T >::value, variant < Ts ... > >::type from ( ) { + static typename std::enable_if < std::is_same < void, T >::value, variant < Ts ... > >::type from ( ) { return variant < Ts ... >( ); } }; diff --git a/alib2std/test-src/extensions/VariantTest.cpp b/alib2std/test-src/extensions/VariantTest.cpp index 3bdc968803a52504a46008db3538062e0e997bea..0e1817204566079c23527237536fc6ab120c5379 100644 --- a/alib2std/test-src/extensions/VariantTest.cpp +++ b/alib2std/test-src/extensions/VariantTest.cpp @@ -126,10 +126,21 @@ void VariantTest::testVariantVoid() { v = 10; CPPUNIT_ASSERT ( v.get<int>() == 10 ); + + std::variant<int, void> v2; + CPPUNIT_ASSERT ( v2.is < void > ( ) ); } void VariantTest::testVariantDefault() { - std::variant<int, std::string> v = std::variant<int, std::string>::from<std::string>(); + std::variant<int, std::string, void> v1 = std::variant<int, std::string, void>::from<std::string>(); + + CPPUNIT_ASSERT ( v1.get<std::string>() == ""); + + std::variant<int, std::string, void> v2 = std::variant<int, std::string, void>::from<void>(); + + CPPUNIT_ASSERT ( v2.is<void> ( ) ); + + std::variant<int, std::string, void> v3 = std::variant<int, std::string, void>::from<int>(); - CPPUNIT_ASSERT ( v.get<std::string>() == ""); + CPPUNIT_ASSERT ( v3.get<int> ( ) == 0 ); }