1
2 // Copyright 2017 Peter Dimov.
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 //
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8
9 #include <boost/variant2/variant.hpp>
10
11 using namespace boost::variant2;
12
13 struct X
14 {
operator intX15 constexpr operator int() const { return 2; }
16 };
17
18 #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
19
main()20 int main()
21 {
22 {
23 constexpr variant<int> v( 1 );
24
25 STATIC_ASSERT( v.index() == 0 );
26 STATIC_ASSERT( get<0>(v) == 1 );
27 }
28
29 {
30 constexpr variant<int> v( 'a' );
31
32 STATIC_ASSERT( v.index() == 0 );
33 STATIC_ASSERT( get<0>(v) == 'a' );
34 }
35
36 {
37 constexpr variant<int> v( X{} );
38
39 STATIC_ASSERT( v.index() == 0 );
40 STATIC_ASSERT( get<0>(v) == 2 );
41 }
42
43 {
44 constexpr variant<int const> v( 1 );
45
46 STATIC_ASSERT( v.index() == 0 );
47 STATIC_ASSERT( get<0>(v) == 1 );
48 }
49
50 {
51 constexpr variant<int const> v( 'a' );
52
53 STATIC_ASSERT( v.index() == 0 );
54 STATIC_ASSERT( get<0>(v) == 'a' );
55 }
56
57 {
58 constexpr variant<int const> v( X{} );
59
60 STATIC_ASSERT( v.index() == 0 );
61 STATIC_ASSERT( get<0>(v) == 2 );
62 }
63
64 {
65 constexpr variant<int, float, X> v( 1 );
66
67 STATIC_ASSERT( v.index() == 0 );
68 STATIC_ASSERT( holds_alternative<int>(v) );
69 STATIC_ASSERT( get<0>(v) == 1 );
70 }
71
72 {
73 constexpr variant<int, float, X> v( 'a' );
74
75 STATIC_ASSERT( v.index() == 0 );
76 STATIC_ASSERT( holds_alternative<int>(v) );
77 STATIC_ASSERT( get<0>(v) == 'a' );
78 }
79
80 {
81 constexpr variant<int, float, X> v( 3.14f );
82
83 STATIC_ASSERT( v.index() == 1 );
84 STATIC_ASSERT( holds_alternative<float>(v) );
85 STATIC_ASSERT( get<1>(v) == 3.14f );
86 }
87
88 {
89 constexpr variant<int, float, X> v( X{} );
90
91 STATIC_ASSERT( v.index() == 2 );
92 STATIC_ASSERT( holds_alternative<X>(v) );
93 }
94
95 {
96 constexpr variant<int, int, float, X> v( 3.14f );
97
98 STATIC_ASSERT( v.index() == 2 );
99 STATIC_ASSERT( holds_alternative<float>(v) );
100 STATIC_ASSERT( get<2>(v) == 3.14f );
101 }
102
103 {
104 constexpr variant<int, int, float, X> v( X{} );
105
106 STATIC_ASSERT( v.index() == 3 );
107 STATIC_ASSERT( holds_alternative<X>(v) );
108 }
109 }
110