visitor_util.hpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Copyright Takatoshi Kondo 2017
  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_VISITOR_UTIL_HPP)
  7. #define MQTT_VISITOR_UTIL_HPP
  8. #include <mqtt/namespace.hpp>
  9. #include <mqtt/variant.hpp>
  10. namespace MQTT_NS {
  11. template <typename... Lambdas>
  12. struct lambda_visitor;
  13. template <typename Lambda1, typename... Lambdas>
  14. struct lambda_visitor<Lambda1, Lambdas...>
  15. : Lambda1, lambda_visitor<Lambdas...> {
  16. using Lambda1::operator();
  17. using lambda_visitor<Lambdas...>::operator();
  18. lambda_visitor(Lambda1 lambda1, Lambdas... lambdas)
  19. : Lambda1(lambda1), lambda_visitor<Lambdas...>(lambdas...) {}
  20. };
  21. template <typename Lambda1>
  22. struct lambda_visitor<Lambda1> : Lambda1 {
  23. using Lambda1::operator();
  24. lambda_visitor(Lambda1 lambda1)
  25. : Lambda1(lambda1) {}
  26. };
  27. template <typename... Lambdas>
  28. inline lambda_visitor<Lambdas...> make_lambda_visitor(Lambdas&&... lambdas) {
  29. return { std::forward<Lambdas>(lambdas)... };
  30. }
  31. } // namespace MQTT_NS
  32. #endif // MQTT_VISITOR_UTIL_HPP