Advertisement
Guest User

Untitled

a guest
Nov 13th, 2013
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1.  
  2. #include <tuple>
  3.  
  4. class lua_State;
  5. template <typename T>
  6. T extract_data(lua_State* L){
  7.     return T(); // Just do nothing, I don't need lua here.
  8. }
  9.  
  10.  
  11. template <unsigned int n>
  12. class tuple_extractor{
  13. public:
  14.     template <typename T, typename ...ArgsOut, typename ...ArgsIn, typename ...ArgsPart>
  15.     static void extractTuple(
  16.             T* obj,
  17.             void (T::*func)(ArgsOut...),
  18.             const std::tuple<ArgsIn...>& inParams,
  19.             ArgsPart... partParams){
  20.         tuple_extractor<n-1>::extractTuple(obj, func, inParams, std::get<n-1>(inParams), partParams...);
  21.     }
  22. };
  23.  
  24. template <>
  25. class tuple_extractor<0>{
  26. public:
  27.     template <typename T, typename ...ArgsOut, typename ...ArgsIn, typename ...ArgsPart>
  28.     static void extractTuple(
  29.             T* obj,
  30.             void (T::*func)(ArgsOut...),
  31.             const std::tuple<ArgsIn...>& inParams,
  32.             ArgsPart... partParams){
  33.         (obj->*func)(partParams...);
  34.     }
  35. };
  36.  
  37. // For last-to-first order use:
  38. template <typename ...Args>
  39. struct getTuple;
  40.  
  41. template <typename T, typename ...Args>
  42. struct getTuple<T, Args...>{
  43.     static inline std::tuple<T, Args...> get(lua_State* L){
  44.         std::tuple<Args...> args = getTuple<Args...>::get(L);
  45.         std::tuple<T> t = std::make_tuple<T>(extract_data<T>(L));
  46.         return std::tuple_cat(t, args);
  47.     }
  48. };
  49.  
  50. template <>
  51. struct getTuple<>{
  52.     static inline std::tuple<> get(lua_State* L){
  53.         return std::make_tuple<>();
  54.     }
  55. };
  56.  
  57. template <typename C, typename R, typename ... Args>
  58. R extract_call(C* ths, lua_State* L, R(C::*method)(Args...))
  59. {
  60.     std::tuple<Args...> tmp = getTuple<Args...>::get(L);
  61.     tuple_extractor<sizeof...(Args)>::extractTuple(ths, method, tmp);
  62. }
  63.  
  64. class cls{
  65. public:
  66.     void method1(int, char, std::string){}
  67.     void method2(int, double, cls*){}
  68.  
  69. };
  70.  
  71. int main(){
  72.  
  73.     cls c;
  74.     lua_State* L = 0;
  75.  
  76.     extract_call(&c, L, &cls::method1 );
  77.     extract_call(&c, L, &cls::method2 );
  78.  
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement