58 callback_ = [](
void*, R (*function)(Args...), Args... args) -> R {
59 if constexpr (std::is_void_v<R>)
61 function(std::forward<Args>(args)...);
66 return function(std::forward<Args>(args)...);
72 typename = std::enable_if_t<!std::is_same_v<remove_cvref_t<F>,
function_ref> &&
73 std::is_invocable_r_v<R, F&, Args...>>>
74 function_ref(F&& fn) noexcept : object_(
const_cast<void*
>(
static_cast<void const*
>(std::addressof(fn))))
76 callback_ = [](
void* object, R (*)(Args...), Args... args) -> R {
78 if constexpr (std::is_void_v<R>)
80 callable(std::forward<Args>(args)...);
85 return callable(std::forward<Args>(args)...);
92 if constexpr (std::is_void_v<R>)
94 callback_(object_, function_, std::forward<Args>(args)...);
99 return callback_(object_, function_, std::forward<Args>(args)...);
104 void* object_ =
nullptr;
105 R (*function_)(Args...) =
nullptr;
106 R (*callback_)(
void*, R (*)(Args...), Args...);