hmbdc
simplify-high-performance-messaging-programming
Traits.hpp
1 #pragma once
2 
3 #include <boost/type_traits.hpp>
4 #include <tuple>
5 
6 namespace hmbdc { namespace pattern {
7 template <typename T>
8 struct function_traits: function_traits<decltype(&T::operator())>
9 {};
10 
11 template <typename ClassType, typename ReturnType, typename... Args>
12 struct function_traits<ReturnType(ClassType::*)(Args...) const> {
13  enum { arity = sizeof...(Args) };
14  typedef ReturnType result_type;
15 
16  template <size_t i>
17  struct arg {
18  using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
19  };
20 };
21 
22 template <typename ClassType, typename ReturnType, typename... Args>
23 struct function_traits<ReturnType(ClassType::*)(Args...)> {
24  enum { arity = sizeof...(Args) };
25 
26  typedef ReturnType result_type;
27 
28  template <size_t i>
29  struct arg {
30  using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
31  };
32 };
33 
34 template <typename Base, typename Derived>
35 struct is_first_base_of{
36  enum {
37  value = std::is_base_of<Base, Derived>::value
38  && (Base const*)((Derived const*)0xffff) == ((Base const*)0xffff)
39  };
40 };
41 }}
Definition: Client.hpp:11