рдореБрдЭреЗ Lua рдХреЛ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд╛рдВрдзрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╣рд╛рде рд╕реЗ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА (рдмрд╣реБрдд рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП) рд╣реИ, рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдПрдХ рдХрд╛рд░рдг рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдлрд┐рдЯ рдирд╣реАрдВ рдереЗред рдореИрдВрдиреЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП? рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ, рдореЗрд░реЗ рд╕рд┐рд░ рдкрд░ рдЪрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рднрдпрд╛рдирдХ рдбрд┐рдЬрд╛рдЗрдиред рддреЛ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рд╕рд░рд▓ рдерд╛ред
C ++ 11 рдореЗрдВ, рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЗрд╕рд╕реЗ рдЖрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ / рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ C ++ 03 рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрд╕рдВрднрд╡ рдерд╛ред рдРрд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереА (рдореИрдВ рд╕реА рдПрдкреАрдЖрдИ рд▓реБрдЖ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреИрдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рдкреЗрдЯ рд▓рд┐рдпрд╛, рдЬреЛ рдмрдЪрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рднреА рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ, рд▓рдЧрднрдЧ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИрдВред
рдирддреАрдЬрддрди, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
lua.export_function(some_function);
рдЖрдк рдЗрд╕реЗ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрддрд╛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
lua.export_function("some_function", &some_function);
рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╣реИрдВ:
- рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп:
template <typename T> void some_function(T (*callback)()) {}
- рдХреЙрд▓рдмреИрдХ рдкреИрд░рд╛рдореАрдЯрд░:
template <typename T> void some_function(void (*callback)(T)) {}
- рд╡рд┐рдзрд┐ рдЬрд┐рд╕ рд╡рд░реНрдЧ рдХреА рд╣реИред
template <typename T> void some_function(void (T::*method)()) {}
рдЗрди рд╕рднреА рдорд╛рдорд▓реЛрдВ (рдФрд░ рдХреБрдЫ рдЕрдиреНрдп) рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
template <typename R, typename... Args> void export_function(const std::string& name, T (*function)(Args...)) { }
рдЕрдм, рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓рдВрдмрд░ рдмрдирд╛рдПрдВ рдЬреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реЗ рддрд░реНрдХ рд▓реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛ред рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╣рд░ рд╕рдордп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред
template <typename R, typename... Args> void export_function(const std::string& name, T (*function)(Args...)) { auto function = new std::function<int(Lua&)>([function](Lua& vm) -> int { auto tuple = args<Args...>(); return apply_function<std::tuple_size<decltype(tuple)>::value> ::apply(function, tuple); }); lambda(function); }
рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реЗ рд╕рднреА рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
template <typename T, typename T1, typename... Args> std::tuple<T, T1, Args...> args(const int i = 1) { T t = arg<T>(i); return std::tuple_cat(t, args<T1, Args...>(i+1)); }
рд╣рдо i-th рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдмрд╛рдХреА рддрд░реНрдХ рдорд┐рд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рдФрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред
template <typename T> std::tuple<T> args(const int i = 1) { return std::tuple<T>(arg<T>(i)); }
рдЖрд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ; рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред
рдЕрдм рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдмрд╛рдд рдореЗрдВ рд╕рднреА рддрд░реНрдХ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
template <int N> struct apply_function { template <typename R, typename... FunctionArgs, typename... TupleArgs, typename... Args> static R apply(R (*function)(Args...), std::tuple<TupleArgs...>, Args... args) { return apply_function<N-1>::apply(function, tuple, std::get<N-1>::value, args); } };
рдФрд░ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
template <> struct apply_function<0> { template <typename R, typename... FunctionArgs, typename... TupleArgs, typename... Args> static R apply(R (*function)(Args...), std::tuple<TupleArgs...>, Args... args) { return (*function)(args...); } };
рдЗрд╕ рд╕рдм рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ)ред
рдкрд░рд┐рдгрд╛рдо
рдпрд╣ рд▓реБрдЖ рдХреЗ рд▓рд┐рдП C ++ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрд╡рд░рдг рд╣реИред рд╕реНрдкрд╖реНрдЯ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╕реЗ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:
- рд▓реИрдореНрдмреНрдбрд╛ рдХреЙрд▓рдмреИрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрднреА рднреА рдзреАрдореЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓реЗрдВрдЧреЗред
- рд╣рд░ рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди / рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЧрд╣рд░рд╛рдИ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИред рд╢рд╛рдпрдж рд╕рдВрдХрд▓рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдЗрдирд▓рд╛рдЗрди рдХреЗ рдЗрд╕ рдкреВрд░реЗ рдЧрд┐рд░реЛрд╣ рдХреЛ рдмрдирд╛ рджреЗрдЧрд╛, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ)ред
- рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЗрд░реЗ рдмрд▓реНрдХрд┐ рдХрдордЬреЛрд░ рд▓реИрдкрдЯреЙрдк рдкрд░, рдЗрд╕ рд░реИрдкрд░ рдФрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
- рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдиреАрдЪ рд╣реИред
- рдореЗрдЯрд╛рдмреЗрдмрд▓реНрд╕ рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдХреЛрдИ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИред
- рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдмрд╕ рдУрд╡рд░рд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЦрд┐рд░реА рддреАрди рдЕрдВрдХ, рд╢рд╛рдпрдж рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХрд░реВрдВрдЧрд╛ред
рдФрд░ рдЕрдм рдкреЗрд╢реЗрд╡рд░реЛрдВ:
- рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
- рд╢реБрджреНрдз C ++ 11 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдкреАрдврд╝реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :: рд▓реБрдЖ рд╡рд░реНрдЧ, рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
util::Lua vm;
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдлрд╝рдВрдХреНрд╢рди / рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпреЛрдВ
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдпрд╣ рд▓реБрдЖ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
some_function(); vm.export_function("some_function", &some_function);
рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрдХреНрд╖рд╛рдПрдВ
рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд░реНрдЧ рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :: LuaClass, рддрд╛рдХрд┐ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдЖрдП, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдбреЗрдЯрд╛ рдХреЛ рдирд╣реАрдВред рддреАрди рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рджред
- Export_class рд╡рд┐рдзрд┐ рдХреЛ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
- Export_me рд╡рд┐рдзрд┐ рдХреЛ Lua :: Export_class <A, B> () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- Class_name рд╡рд┐рдзрд┐ рдХреЛ рд╡рд░реНрдЧ рдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
class A : public util::LuaClass { public: static void export_class(Lua& vm); static void export_me(Lua& vm); static const std::string class_name(); }; void A::export_me(Lua& vm) { vm.export_class<A>(); } class B: public A { public: static void export_class(Lua& vm); static void export_me(Lua& vm); static const std::string class_name(); }; void B::export_me(Lua& vm) { vm.export_class<B, A>(); }
рдЙрдкрдпреЛрдЧ :: Lua :: Export_class рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд╣ рд╡рд░реНрдЧ рдЬрд┐рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд Export_class рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣реЛ рд░рд╣реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
vm.export_constructor<A, int>(); vm.export_function("static_method", &A::static_method); vm.export_method("method", &A::method);
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рдирд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдирдП рдирд╛рдо рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓реБрдЖ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдХрд░ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреАред рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рд▓реАрдЯ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрдб
рд╕рднреА рдХреЛрдб MIT рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд
github.com/alex-ac/LuaCxx github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА, рд╕реБрдЭрд╛рд╡, рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдпреБрдкреАрдбреА
рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рдХреЛрдб g ++ 4.7.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, g ++> = 4.6.4 рдФрд░ clang> = 3.0 рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред