24#ifndef PXR_BASE_TF_FUNCTION_REF_H
25#define PXR_BASE_TF_FUNCTION_REF_H
33PXR_NAMESPACE_OPEN_SCOPE
98template <
class Ret,
class... Args>
105 template <
typename Fn>
106 using _IsFunctionRef = std::is_same<
107 std::remove_cv_t<std::remove_reference_t<Fn>>,
TfFunctionRef>;
111 template <class Fn, class = std::enable_if_t<!_IsFunctionRef<Fn>::value>>
113 : _fn(
static_cast<void const *
>(std::addressof(fn)))
114 , _invoke(_InvokeFn<Fn>) {}
127 std::enable_if_t<!_IsFunctionRef<Fn>::value,
129 operator=(Fn &fn)
noexcept {
137 std::swap(_fn, other._fn);
138 std::swap(_invoke, other._invoke);
142 inline Ret operator()(Args... args)
const {
143 return _invoke(_fn, std::forward<Args>(args)...);
148 static Ret _InvokeFn(
void const *fn, Args...args) {
149 using FnPtr =
typename std::add_pointer<
150 typename std::add_const<Fn>::type>::type;
151 return (*
static_cast<FnPtr
>(fn))(std::forward<Args>(args)...);
155 Ret (*_invoke)(
void const *, Args...);
166PXR_NAMESPACE_CLOSE_SCOPE
This class provides a non-owning reference to a type-erased callable object with a specified signatur...