29 callback_ = [](
void*, R (*function)(Args...), Args... args) -> R
31 if constexpr (std::is_void_v<R>)
33 function(std::forward<Args>(args)...);
38 return function(std::forward<Args>(args)...);
43 template <
typename F,
typename = std::enable_if_t<!std::is_same_v<remove_cvref_t<F>, function_ref>
44 && std::is_invocable_r_v<R, F&, Args...>>>
45 function_ref(F&& fn) noexcept : object_(
const_cast<void*
>(
static_cast<void const*
>(std::addressof(fn))))
47 callback_ = [](
void* object, R (*)(Args...), Args... args) -> R
50 if constexpr (std::is_void_v<R>)
52 callable(std::forward<Args>(args)...);
57 return callable(std::forward<Args>(args)...);
65 if constexpr (std::is_void_v<R>)
67 callback_(object_, function_, std::forward<Args>(args)...);
72 return callback_(object_, function_, std::forward<Args>(args)...);
77 void* object_ =
nullptr;
78 R (*function_)(Args...) =
nullptr;
79 R (*callback_)(
void*, R (*)(Args...), Args...);