// Copyright (c) 2017 // Mikhail Maximov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // The test is base on https://svn.boost.org/trac/boost/ticket/8554 // variant was not able to extract types from mpl::joint_view #include #include "boost/config.hpp" #include "boost/core/lightweight_test.hpp" #include "boost/variant.hpp" #include "boost/mpl/joint_view.hpp" #include "boost/mpl/insert_range.hpp" #include "boost/mpl/set.hpp" template void check_exception_on_get(Variant& v) { try { boost::get(v); BOOST_ERROR("Expected exception boost::bad_get, but got nothing."); } catch (boost::bad_get&) { //okay it is expected behaviour } catch (...) { BOOST_ERROR("Expected exception boost::bad_get, but got something else."); } } void test_joint_view() { typedef boost::variant v1; typedef boost::variant v2; typedef boost::make_variant_over::type>::type v3; v1 a = 1; v2 b = "2"; v3 c = a; BOOST_TEST(boost::get(c) == 1); BOOST_TEST(c.which() == 0); v3 d = b; BOOST_TEST(boost::get(d) == "2"); BOOST_TEST(d.which() == 1); check_exception_on_get(c); check_exception_on_get(d); } void test_set() { typedef boost::mpl::set2< std::string, int > types; typedef boost::make_variant_over< types >::type v; v a = 1; BOOST_TEST(boost::get(a) == 1); check_exception_on_get(a); a = "2"; BOOST_TEST(boost::get(a) == "2"); check_exception_on_get(a); } int main() { test_joint_view(); test_set(); return boost::report_errors(); }