#ifndef FUNCTIONTRAITS_H #define FUNCTIONTRAITS_H #include #include #include template class FunctionTraits; template struct IsTuple : std::false_type { enum { num = 1, }; }; template struct IsTuple> : std::true_type { enum { num = std::tuple_size>::value, }; }; template struct IsTuple> : std::true_type { enum { num = std::tuple_size>::value, }; }; template class FunctionTraits { public: enum { arity = sizeof...(Args), Results = IsTuple::num }; using FunctionType = Ret(Args...); using FunctionPointerType = FunctionType *; using ReturnType = Ret; using StlFunctionType = std::function; using Arguments = std::tuple; template class Argument { public: static_assert(I < arity, "index is out of range, index must less than sizeof Args..."); using Type = std::tuple_element_t; }; using FirstArgumentType = typename Argument<0>::Type; }; template class FunctionTraits { public: enum { arity = 0, Results = IsTuple::num }; using FunctionType = Ret(); using FunctionPointerType = FunctionType *; using ReturnType = Ret; using StlFunctionType = std::function; using Arguments = std::tuple<>; using FirstArgumentType = void; template class Argument { public: using Type = void; }; }; template <> class FunctionTraits { public: using Arguments = std::tuple<>; using FirstArgumentType = void; template class Argument { public: using Type = void; }; }; template class FunctionTraits : public FunctionTraits {}; template class FunctionTraits> : public FunctionTraits {}; template class FunctionTraits : public FunctionTraits {}; template class FunctionTraits : public FunctionTraits {}; template class FunctionTraits : public FunctionTraits {}; template class FunctionTraits : public FunctionTraits {}; // std::bind for object methods rclcpp/rclcpp/include/rclcpp/function_traits.hpp template #if defined _GLIBCXX_RELEASE // glibc++ (GNU C++ >= 7.1) struct FunctionTraits> #elif defined __GLIBCXX__ // glibc++ (GNU C++) struct FunctionTraits(FArgs...)>> #elif defined _MSC_VER // MS Visual Studio struct FunctionTraits> #elif defined __clang__ struct FunctionTraits> #else #error "Unsupported C++ compiler / standard library" #endif : FunctionTraits { }; // template // class FunctionTraits> // : public FunctionTraits::operator())> {}; template class FunctionTraits : public FunctionTraits {}; template typename FunctionTraits>::StlFunctionType makeStlFunction(Function &&lambda) { return static_cast>::StlFunctionType>( std::forward(lambda)); } #endif // FUNCTIONTRAITS_H