emlabcpp
modern opinionated embedded C++ library
visit.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "algorithm/impl.h"
27 
28 #include <tuple>
29 #include <variant>
30 
31 namespace emlabcpp
32 {
33 
34 template < typename Visitor, typename Variant >
35 decltype( auto ) visit_index( Visitor&& vis, Variant const& var )
36 {
37  return impl::index_switch< 0, std::variant_size_v< std::decay_t< Variant > > >(
38  var.index(), std::forward< Visitor >( vis ) );
39 }
40 
43 template < typename Visitor, typename Variant >
44 decltype( auto ) visit( Visitor&& vis, Variant&& var )
45 {
46  return visit_index(
47  [&vis, &var]< std::size_t i >() {
48  return vis( *std::get_if< i >( &var ) );
49  },
50  std::forward< Variant >( var ) );
51 }
52 
56 template < typename Visitor, typename Variant >
57 decltype( auto ) apply_on_visit( Visitor&& vis, Variant&& var )
58 {
59  return emlabcpp::visit(
60  [&vis]< typename Item >( Item&& item ) -> decltype( auto ) {
61  return std::apply(
62  [&vis]< typename... Vals >( Vals&&... vals ) -> decltype( auto ) {
63  return vis( std::forward< Vals >( vals )... );
64  },
65  std::forward< Item >( item ) );
66  },
67  std::forward< Variant >( var ) );
68 }
69 
70 } // namespace emlabcpp
MIT License.
Definition: impl.h:31
decltype(auto) visit_index(Visitor &&vis, Variant const &var)
Definition: visit.h:35
decltype(auto) visit(Visitor &&vis, Variant &&var)
Reimplementation of std::visit.
Definition: visit.h:44
decltype(auto) apply_on_visit(Visitor &&vis, Variant &&var)
Combines visit and std::apply into one step - provided variant is expanded with visit and apply is ca...
Definition: visit.h:57