From f5cca14c29a15b1d094ef47ca38f817ae74c424c Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 11 Nov 2016 21:31:33 +0100 Subject: [PATCH] fix default creation of variant --- alib2std/src/extensions/variant.hpp | 8 +++++--- alib2std/test-src/extensions/VariantTest.cpp | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index 112d100f89..25c1907e05 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 3bdc968803..0e18172045 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 ); } -- GitLab