8#ifndef PXR_BASE_TF_FUNCTION_TRAITS_H
9#define PXR_BASE_TF_FUNCTION_TRAITS_H
13#include "pxr/base/tf/meta.h"
19PXR_NAMESPACE_OPEN_SCOPE
22template <
class Ret,
class ArgTypeList>
25 using ReturnType = Ret;
26 using ArgTypes = ArgTypeList;
27 using ArgsTuple = TfMetaApply<std::tuple, ArgTypes>;
28 static const size_t Arity = TfMetaApply<TfMetaLength, ArgTypes>::value;
31 using NthArg = std::tuple_element_t<N, ArgsTuple>;
36template <
class FuncSig>
37using Tf_RemoveThisArg = Tf_FuncSig<
38 typename FuncSig::ReturnType,
39 TfMetaApply<TfMetaTail, typename FuncSig::ArgTypes>>;
46 using Type = Tf_RemoveThisArg<
47 typename Tf_GetFuncSig<
48 decltype(&std::remove_reference<Fn>::type::operator())
54template <
class Ret,
class Cls,
class... Args>
55struct Tf_GetFuncSig<Ret (Cls::*)(Args...)>
57 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &, Args...>>;
59template <
class Ret,
class Cls,
class... Args>
60struct Tf_GetFuncSig<Ret (Cls::*)(Args...) &>
62 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &, Args...>>;
64template <
class Ret,
class Cls,
class... Args>
65struct Tf_GetFuncSig<Ret (Cls::*)(Args...) &&>
67 using Type = Tf_FuncSig<Ret, TfMetaList<Cls &&, Args...>>;
70template <
class Ret,
class Cls,
class... Args>
71struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const>
73 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &, Args...>>;
75template <
class Ret,
class Cls,
class... Args>
76struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const &>
78 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &, Args...>>;
80template <
class Ret,
class Cls,
class... Args>
81struct Tf_GetFuncSig<Ret (Cls::*)(Args...) const &&>
83 using Type = Tf_FuncSig<Ret, TfMetaList<Cls
const &&, Args...>>;
87template <
class Ret,
class... Args>
88struct Tf_GetFuncSig<Ret (*)(Args...)>
90 using Type = Tf_FuncSig<Ret, TfMetaList<Args...>>;
95using TfFunctionTraits =
typename Tf_GetFuncSig<Fn>::Type;
97PXR_NAMESPACE_CLOSE_SCOPE