halcheck 1.0
Loading...
Searching...
No Matches
overload.hpp
1#ifndef HALCHECK_LIB_FUNCTIONAL_OVERLOAD_HPP
2#define HALCHECK_LIB_FUNCTIONAL_OVERLOAD_HPP
3
4// IWYU pragma: private, include <halcheck/lib/functional.hpp>
5
6#include <utility>
7
8namespace halcheck { namespace lib {
9
15template<typename... Args>
16struct overload {
17#ifdef HALCHECK_DOXYGEN
23 explicit overload(Args... args);
24#endif
25};
26
27template<typename T>
28struct overload<T> : private T {
29 using T::operator();
30 explicit overload(T head) : T(std::move(head)) {}
31};
32
33template<typename T, typename... Args>
34struct overload<T, Args...> : private T, private overload<Args...> {
35 using T::operator();
36 using overload<Args...>::operator();
37 explicit overload(T head, Args... tail) : T(std::move(head)), overload<Args...>(std::move(tail)...) {}
38};
39
47template<typename... Args>
48lib::overload<Args...> make_overload(Args... args) {
49 return lib::overload<Args...>(std::move(args)...);
50}
51
52}} // namespace halcheck::lib
53
54#endif
lib::overload< Args... > make_overload(Args... args)
Constructs an overloaded functor from a set of pre-existing functors.
Definition overload.hpp:48
STL namespace.
overload(Args... args)
Construct a new overload set.*.
Represents an overload set as a single value.
Definition overload.hpp:16