24 #ifndef PXR_BASE_TF_FUNCTION_REF_H 25 #define PXR_BASE_TF_FUNCTION_REF_H 30 #include <type_traits> 33 PXR_NAMESPACE_OPEN_SCOPE
98 template <
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 {
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...);
166 PXR_NAMESPACE_CLOSE_SCOPE
168 #endif // PXR_BASE_TF_FUNCTION_REF_H void swap(ArAssetInfo &lhs, ArAssetInfo &rhs)
This class provides a non-owning reference to a type-erased callable object with a specified signatur...
void swap(UsdStageLoadRules &l, UsdStageLoadRules &r)
Swap the contents of rules l and r.