// Copyright 2017 Peter Dimov. // // 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 #if defined(_MSC_VER) # pragma warning( disable: 4244 ) // conversion from float to int, possible loss of data #endif #include #include using namespace boost::variant2; struct F1 { template T1 operator()( T1 t1 ) const { return t1; } }; struct F2 { template auto operator()( T1 t1, T2 t2 ) const -> decltype( t1 + t2 ) { return t1 + t2; } }; struct F3 { template auto operator()( T1 t1, T2 t2, T3 t3 ) const -> decltype( t1 + t2 + t3 ) { return t1 + t2 + t3; } }; struct F4 { template auto operator()( T1 t1, T2 t2, T3 t3, T4 t4 ) const -> decltype( t1 + t2 + t3 + t4 ) { return t1 + t2 + t3 + t4; } }; int main() { { BOOST_TEST_EQ( (visit( []{ return 3.14f; } )), 3 ); } { variant v( 1 ); BOOST_TEST_EQ( visit( F1(), v ), 1 ); BOOST_TEST_EQ( visit( F1(), v ), 1.0f ); } { variant const v( 3.14f ); BOOST_TEST_EQ( visit( F1(), v ), 3 ); BOOST_TEST_EQ( visit( F1(), v ), 3.14f ); } { variant v1( 1 ); variant const v2( 3.14f ); BOOST_TEST_EQ( visit( F2(), v1, v2 ), 4 ); BOOST_TEST_EQ( visit( F2(), v1, v2 ), 1 + 3.14f ); } { variant v1( 1 ); variant const v2( 3.14f ); variant v3( 6.28 ); BOOST_TEST_EQ( visit( F3(), v1, v2, v3 ), 10 ); BOOST_TEST_EQ( visit( F3(), v1, v2, v3 ), static_cast( 1 + 3.14f + 6.28 ) ); } { variant v1( 1 ); variant const v2( 3.14f ); variant v3( 6.28 ); variant const v4( 'A' ); BOOST_TEST_EQ( visit( F4(), v1, v2, v3, v4 ), 10 + 'A' ); BOOST_TEST_EQ( visit( F4(), v1, v2, v3, v4 ), static_cast( 1 + 3.14f + 6.28 + 'A' ) ); } return boost::report_errors(); }