Guest User

Untitled

a guest
Jul 16th, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3. #include <tuple>
  4. #include <type_traits>
  5. #include <utility>
  6.  
  7. using namespace std;
  8. using std::forward; // You can change this if you like unreadable code or care hugely about namespace pollution.
  9.  
  10. template<size_t N>
  11. struct ApplyMember
  12. {
  13.     template<typename C, typename F, typename T, typename... A>
  14.     static inline auto apply(C&& c, F&& f, T&& t, A&&... a) ->
  15.         decltype(ApplyMember<N-1>::apply(forward<C>(c), forward<F>(f), forward<T>(t), std::get<N-1>(forward<T>(t)), forward<A>(a)...))
  16.     {
  17.         return ApplyMember<N-1>::apply(forward<C>(c), forward<F>(f), forward<T>(t), std::get<N-1>(forward<T>(t)), forward<A>(a)...);
  18.     }
  19. };
  20.  
  21. template<>
  22. struct ApplyMember<0>
  23. {
  24.     template<typename C, typename F, typename T, typename... A>
  25.     static inline auto apply(C&& c, F&& f, T&&, A&&... a) ->
  26.         decltype((forward<C>(c)->*forward<F>(f))(forward<A>(a)...))
  27.     {
  28.         return (forward<C>(c)->*forward<F>(f))(forward<A>(a)...);
  29.     }
  30. };
  31.  
  32. // C is the class, F is the member function, T is the tuple.
  33. template<typename C, typename F, typename T>
  34. inline auto apply(C&& c, F&& f, T&& t) ->
  35.     decltype(ApplyMember<std::tuple_size<typename std::decay<T>::type>::value>::apply(forward<C>(c), forward<F>(f), forward<T>(t)))
  36. {
  37.     return ApplyMember<std::tuple_size<typename std::decay<T>::type>::value>::apply(forward<C>(c), forward<F>(f), forward<T>(t));
  38. }
  39.  
  40.  
  41. class Test
  42. {
  43. public:
  44.     Test(){};
  45.     ~Test(){};
  46.  
  47.     void f1(int i1 = 0) { cout << "f1: " << i1 << endl; }
  48.     void f2(int i1 = 0, int i2 = 0) {cout << "f2: " << i1 << " " << i2 << endl;}
  49. };
  50.  
  51. template<int N, typename A>
  52. struct caller
  53. {
  54.     void operator()(A a){}
  55. };
  56.  
  57. template<typename A>
  58. struct caller<0, A>
  59. {
  60.     void operator()(A a)
  61.     {
  62.         Test *t = new Test();
  63.         apply(t, &Test::f1, a);
  64.         delete t;
  65.     }
  66. };
  67.  
  68. template<typename A>
  69. struct caller<1, A>
  70. {
  71.     void operator()(A a)
  72.     {
  73.         Test *t {new Test()};
  74.         apply(t, &Test::f2, a);
  75.         delete t;
  76.     }
  77. };
  78. std::tuple<
  79.     caller<0, std::tuple<int>>,
  80.     caller<1, std::tuple<int, int>>
  81. > g_call;
  82.  
  83. template<int N, typename A>
  84. void call(A a)
  85. {
  86.     std::get<N>(g_call)(a);
  87. }
  88.  
  89. int main()
  90. {
  91.     std::tuple<int> a1 {1};
  92.     std::tuple<int, int> a2 {3,4};
  93.    
  94.     call<0>(a1);
  95.     call<1>(a2);
  96.  
  97.     system("pause");
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment