// File: test8.cpp #include "boost/test/minimal.hpp" #include "boost/variant.hpp" #include #include #include using namespace std; using namespace boost; typedef variant > t_var1; struct int_sum : static_visitor<> { int_sum() : result_(0) { } void operator()(int t) { result_ += t; } result_type operator()(float ) { } result_type operator()(const std::string& ) { } result_type operator()(const std::vector& ) { } int result_; }; template T& check_pass(Variant& v, T value) { BOOST_CHECK(get(&v)); try { T& r = get(v); BOOST_CHECK(r == value); return r; } catch(boost::bad_get&) { throw; // must never reach } } template void check_fail(Variant& v) { BOOST_CHECK(!get(&v)); try { T& r = get(v); BOOST_CHECK(false && &r); // should never reach } catch(boost::bad_get&) { // (do nothing here) } } int test_main(int , char* []) { int_sum acc; t_var1 v1 = 800; // check get on non-const variant { int& r1 = check_pass(v1, 800); check_fail(v1); check_fail(v1); check_fail(v1); check_fail(v1); check_fail(v1); apply_visitor(acc, v1); BOOST_CHECK(acc.result_ == 800); r1 = 920; // NOTE: modifies content of v1 apply_visitor(acc, v1); BOOST_CHECK(acc.result_ == 800 + 920); } // check const correctness: { const t_var1& c = v1; check_pass(c, 920); check_fail(c); check_fail(c); check_fail(c); check_fail(c); check_fail(c); } return boost::exit_success; }