15 #ifndef RCLCPP__FUNCTION_TRAITS_HPP_
16 #define RCLCPP__FUNCTION_TRAITS_HPP_
25 namespace function_traits
41 template<
typename Head,
typename ... Tail>
44 using type = std::tuple<Tail ...>;
48 template<
typename FunctionT>
52 typename function_traits<decltype( &FunctionT::operator())>::arguments>::type;
54 static constexpr std::size_t arity = std::tuple_size<arguments>::value;
56 template<std::
size_t N>
57 using argument_type =
typename std::tuple_element<N, arguments>::type;
59 using return_type =
typename function_traits<decltype( &FunctionT::operator())>::return_type;
63 template<
typename ReturnTypeT,
typename ... Args>
66 using arguments = std::tuple<Args ...>;
68 static constexpr std::size_t arity = std::tuple_size<arguments>::value;
70 template<std::
size_t N>
71 using argument_type =
typename std::tuple_element<N, arguments>::type;
73 using return_type = ReturnTypeT;
77 template<
typename ReturnTypeT,
typename ... Args>
82 template<
typename ClassT,
typename ReturnTypeT,
typename ... Args,
typename ... FArgs>
83 #if defined DOXYGEN_ONLY
84 struct function_traits<std::bind<ReturnTypeT (ClassT::*)(Args ...), FArgs ...>>
85 #elif defined _LIBCPP_VERSION
86 struct
function_traits<std::__bind<ReturnTypeT (ClassT::*)(Args ...), FArgs ...>>
87 #elif defined _GLIBCXX_RELEASE
88 struct
function_traits<std::_Bind<ReturnTypeT(ClassT::* (FArgs ...))(Args ...)>>
89 #elif defined __GLIBCXX__
90 struct
function_traits<std::_Bind<std::_Mem_fn<ReturnTypeT (ClassT::*)(Args ...)>(FArgs ...)>>
91 #elif defined _MSC_VER
93 std::_Binder<std::_Unforced, ReturnTypeT (ClassT::*)(Args ...), FArgs ...>>
95 #error "Unsupported C++ compiler / standard library"
101 template<
typename ClassT,
typename ReturnTypeT,
typename ... Args,
typename ... FArgs>
102 #if defined DOXYGEN_ONLY
103 struct function_traits<std::bind<ReturnTypeT (ClassT::*)(Args ...) const, FArgs ...>>
104 #elif defined _LIBCPP_VERSION
105 struct function_traits<std::__bind<ReturnTypeT (ClassT::*)(Args ...) const, FArgs ...>>
106 #elif defined _GLIBCXX_RELEASE
107 struct function_traits<std::_Bind<ReturnTypeT(ClassT::* (FArgs ...))(Args ...) const>>
108 #elif defined __GLIBCXX__
109 struct function_traits<std::_Bind<std::_Mem_fn<ReturnTypeT (ClassT::*)(Args ...) const>(FArgs ...)>>
110 #elif defined _MSC_VER
111 struct function_traits<
112 std::_Binder<std::_Unforced, ReturnTypeT (ClassT::*)(Args ...) const, FArgs ...>>
114 #error "Unsupported C++ compiler / standard library"
116 : function_traits<ReturnTypeT(Args ...)>
120 template<
typename ReturnTypeT,
typename ... Args,
typename ... FArgs>
121 #if defined DOXYGEN_ONLY
122 struct function_traits<std::bind<ReturnTypeT( &)(Args ...), FArgs ...>>
123 #elif defined _LIBCPP_VERSION
124 struct function_traits<std::__bind<ReturnTypeT( &)(Args ...), FArgs ...>>
125 #elif defined __GLIBCXX__
126 struct function_traits<std::_Bind<ReturnTypeT(*(FArgs ...))(Args ...)>>
127 #elif defined _MSC_VER
128 struct function_traits<std::_Binder<std::_Unforced, ReturnTypeT( &)(Args ...), FArgs ...>>
130 #error "Unsupported C++ compiler / standard library"
132 : function_traits<ReturnTypeT(Args ...)>
136 template<
typename ClassT,
typename ReturnTypeT,
typename ... Args>
141 template<
typename FunctionT>
145 template<
typename FunctionT>
153 template<std::
size_t Arity,
typename FunctorT>
155 bool, (Arity == function_traits<FunctorT>::arity)> {};
157 template<
typename FunctorT,
typename ... Args>
159 typename function_traits<FunctorT>::arguments,
164 template<
typename FunctorAT,
typename FunctorBT>
166 typename function_traits<FunctorAT>::arguments,
167 typename function_traits<FunctorBT>::arguments
174 template<
typename ReturnTypeT,
typename ... Args>
177 template<
typename ReturnTypeT,
typename ... Args>
180 using type = std::function<ReturnTypeT(Args ...)>;
192 typename FunctionTraits::return_type,
193 typename FunctionTraits::arguments
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.