overloaded.h 727 B

12345678910111213141516171819202122232425262728293031
  1. #pragma once
  2. #include <memory>
  3. namespace c10 {
  4. namespace detail {
  5. template <class... Ts>
  6. struct overloaded_t {};
  7. template <class T0>
  8. struct overloaded_t<T0> : T0 {
  9. using T0::operator();
  10. overloaded_t(T0 t0) : T0(std::move(t0)) {}
  11. };
  12. template <class T0, class... Ts>
  13. struct overloaded_t<T0, Ts...> : T0, overloaded_t<Ts...> {
  14. using T0::operator();
  15. using overloaded_t<Ts...>::operator();
  16. overloaded_t(T0 t0, Ts... ts)
  17. : T0(std::move(t0)), overloaded_t<Ts...>(std::move(ts)...) {}
  18. };
  19. } // namespace detail
  20. // Construct an overloaded callable combining multiple callables, e.g. lambdas
  21. template <class... Ts>
  22. detail::overloaded_t<Ts...> overloaded(Ts... ts) {
  23. return {std::move(ts)...};
  24. }
  25. } // namespace c10