variant_get_by_index_cx.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. #include <boost/config.hpp>
  9. using namespace boost::variant2;
  10. #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
  11. #if BOOST_WORKAROUND(BOOST_GCC, < 50000)
  12. # define STATIC_ASSERT_IF(...)
  13. #else
  14. # define STATIC_ASSERT_IF(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
  15. #endif
  16. int main()
  17. {
  18. {
  19. constexpr variant<int> v;
  20. STATIC_ASSERT( get<0>(v) == 0 );
  21. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  22. }
  23. {
  24. constexpr variant<int> v( 1 );
  25. STATIC_ASSERT( get<0>(v) == 1 );
  26. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  27. }
  28. {
  29. constexpr variant<int, float> v;
  30. STATIC_ASSERT( get<0>(v) == 0 );
  31. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  32. STATIC_ASSERT_IF( get_if<1>(&v) == nullptr );
  33. }
  34. {
  35. constexpr variant<int, float> v( 1 );
  36. STATIC_ASSERT( get<0>(v) == 1 );
  37. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  38. STATIC_ASSERT_IF( get_if<1>(&v) == nullptr );
  39. }
  40. {
  41. constexpr variant<int, float> v( 3.14f );
  42. STATIC_ASSERT( get<1>(v) == 3.14f );
  43. STATIC_ASSERT_IF( get_if<0>(&v) == nullptr );
  44. STATIC_ASSERT_IF( get_if<1>(&v) == &get<1>(v) );
  45. }
  46. {
  47. constexpr variant<int, float, float> v;
  48. STATIC_ASSERT( get<0>(v) == 0 );
  49. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  50. STATIC_ASSERT_IF( get_if<1>(&v) == nullptr );
  51. STATIC_ASSERT_IF( get_if<2>(&v) == nullptr );
  52. }
  53. {
  54. constexpr variant<int, float, float> v( 1 );
  55. STATIC_ASSERT( get<0>(v) == 1 );
  56. STATIC_ASSERT_IF( get_if<0>(&v) == &get<0>(v) );
  57. STATIC_ASSERT_IF( get_if<1>(&v) == nullptr );
  58. STATIC_ASSERT_IF( get_if<2>(&v) == nullptr );
  59. }
  60. {
  61. constexpr variant<int, int, float> v( 3.14f );
  62. STATIC_ASSERT( get<2>(v) == 3.14f );
  63. STATIC_ASSERT_IF( get_if<0>(&v) == nullptr );
  64. STATIC_ASSERT_IF( get_if<1>(&v) == nullptr );
  65. STATIC_ASSERT_IF( get_if<2>(&v) == &get<2>(v) );
  66. }
  67. }