25#ifndef PXR_BASE_TF_FUNCTION_TRAITS_H
26#define PXR_BASE_TF_FUNCTION_TRAITS_H
30#include "pxr/base/tf/meta.h"
36PXR_NAMESPACE_OPEN_SCOPE
39template <
class Ret,
class ArgTypeList>
42 using ReturnType = Ret;
43 using ArgTypes = ArgTypeList;
44 using ArgsTuple = TfMetaApply<std::tuple, ArgTypes>;
45 static const size_t Arity = TfMetaApply<TfMetaLength, ArgTypes>::value;
48 using NthArg = std::tuple_element_t<N, ArgsTuple>;
53template <
class FuncSig>
54using Tf_RemoveThisArg = Tf_FuncSig<
55 typename FuncSig::ReturnType,
56 TfMetaApply<TfMetaTail, typename FuncSig::ArgTypes>>;
63 using Type = Tf_RemoveThisArg<
64 typename Tf_GetFuncSig<
65 decltype(&std::remove_reference<Fn>::type::operator())
71template <
class Ret,
class Cls,
class... Args>
72struct Tf_GetFuncSig<Ret (Cls::*)(Args...)>
74 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &, Args...>>;
76template <
class Ret,
class Cls,
class... Args>
77struct Tf_GetFuncSig<Ret (Cls::*)(Args...) &>
79 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &, Args...>>;
81template <
class Ret,
class Cls,
class... Args>
82struct Tf_GetFuncSig<Ret (Cls::*)(Args...) &&>
84 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &&, Args...>>;
87template <
class Ret,
class Cls,
class... Args>
88struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const>
90 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &, Args...>>;
92template <
class Ret,
class Cls,
class... Args>
93struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const &>
95 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &, Args...>>;
97template <
class Ret,
class Cls,
class... Args>
98struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const &&>
100 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &&, Args...>>;
104template <
class Ret,
class... Args>
105struct Tf_GetFuncSig<Ret (*)(Args...)>
107 using Type = Tf_FuncSig<Ret, TfMetaList<Args...>>;
112using TfFunctionTraits =
typename Tf_GetFuncSig<Fn>::Type;
114PXR_NAMESPACE_CLOSE_SCOPE