blob: 54ddba0e1c777b4e6bdc97a0df7212f4c9b58ead [file] [log] [blame]
James Ward22a4e152020-09-25 11:43:21 +01001#ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP
2#define MAPBOX_UTIL_VARIANT_VISITOR_HPP
3
4#include <utility>
5
6namespace mapbox {
7namespace util {
8
9template <typename... Fns>
10struct visitor;
11
12template <typename Fn>
13struct visitor<Fn> : Fn
14{
15 using Fn::operator();
16
17 template<typename T>
18 visitor(T&& fn) : Fn(std::forward<T>(fn)) {}
19};
20
21template <typename Fn, typename... Fns>
22struct visitor<Fn, Fns...> : Fn, visitor<Fns...>
23{
24 using Fn::operator();
25 using visitor<Fns...>::operator();
26
27 template<typename T, typename... Ts>
28 visitor(T&& fn, Ts&&... fns)
29 : Fn(std::forward<T>(fn))
30 , visitor<Fns...>(std::forward<Ts>(fns)...) {}
31};
32
33template <typename... Fns>
34visitor<typename std::decay<Fns>::type...> make_visitor(Fns&&... fns)
35{
36 return visitor<typename std::decay<Fns>::type...>
37 (std::forward<Fns>(fns)...);
38}
39
40} // namespace util
41} // namespace mapbox
42
43#endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP