variant_value_construct_cx.cpp 2.3 KB

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