5 #ifndef PACKIO_UNIQUE_FUNCTION_H
6 #define PACKIO_UNIQUE_FUNCTION_H
16 class movable_function :
public std::function<T> {
17 template <
typename Fn,
typename En =
void>
22 template <
typename Fn>
23 struct wrapper<Fn, std::enable_if_t<std::is_copy_constructible<Fn>::value>> {
26 template <
typename... Args>
27 auto operator()(Args&&... args)
29 return fn(std::forward<Args>(args)...);
34 template <
typename Fn>
38 !std::is_copy_constructible<Fn>::value
39 && std::is_move_constructible<Fn>::value>> {
42 wrapper(Fn&& fn) : fn(std::forward<Fn>(fn)) {}
44 wrapper(wrapper&&) =
default;
45 wrapper& operator=(wrapper&&) =
default;
48 wrapper(
const wrapper& rhs) : fn(const_cast<Fn&&>(rhs.fn))
53 wrapper& operator=(wrapper&) { std::abort(); }
55 template <
typename... Args>
56 auto operator()(Args&&... args)
58 return fn(std::forward<Args>(args)...);
62 using base = std::function<T>;
65 movable_function() noexcept = default;
66 movable_function(std::nullptr_t) noexcept : base(
nullptr) {}
68 template <
typename Fn>
69 movable_function(Fn&& f) : base(wrapper<Fn>{std::forward<Fn>(f)})
73 movable_function(movable_function&&) =
default;
74 movable_function& operator=(movable_function&&) =
default;
76 movable_function& operator=(std::nullptr_t)
78 base::operator=(
nullptr);
82 template <
typename Fn>
83 movable_function& operator=(Fn&& f)
85 base::operator=(wrapper<Fn>{std::forward<Fn>(f)});
89 using base::operator();
The packio namespace.
Definition: arg.h:14