variant.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright Takatoshi Kondo 2018
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #if !defined(MQTT_VARIANT_HPP)
  7. #define MQTT_VARIANT_HPP
  8. #include <mqtt/config.hpp>
  9. #include <mqtt/namespace.hpp>
  10. #if defined(MQTT_STD_VARIANT)
  11. #include <variant>
  12. namespace MQTT_NS {
  13. using std::variant;
  14. template<typename T, typename U>
  15. decltype(auto) variant_get(U && arg)
  16. {
  17. return std::get<T>(std::forward<U>(arg));
  18. }
  19. template<typename T>
  20. decltype(auto) variant_idx(T const& arg)
  21. {
  22. return arg.index();
  23. }
  24. using std::visit;
  25. } // namespace MQTT_NS
  26. #else // defined(MQTT_STD_VARIANT)
  27. #include <boost/variant.hpp>
  28. #include <boost/variant/get.hpp>
  29. #include <boost/variant/apply_visitor.hpp>
  30. namespace MQTT_NS {
  31. using boost::variant;
  32. template<typename T, typename U>
  33. decltype(auto) variant_get(U && arg)
  34. {
  35. return boost::get<T>(std::forward<U>(arg));
  36. }
  37. template<typename T>
  38. decltype(auto) variant_idx(T const& arg)
  39. {
  40. return arg.which();
  41. }
  42. template <typename Visitor, typename... Variants>
  43. constexpr decltype(auto) visit(Visitor&& vis, Variants&&... vars)
  44. {
  45. return boost::apply_visitor(std::forward<Visitor>(vis), std::forward<Variants>(vars)...);
  46. }
  47. } // namespace MQTT_NS
  48. #endif // defined(MQTT_STD_VARIANT)
  49. #endif // MQTT_VARIANT_HPP