Пересмотрев большинство библиотек, предназначенных для вызова Lua из C++ и наоборот, пришел к выводу что наиболее удачным и простым будет сочетание LuaClassBasedCall и Lunar.
Из c++ вызов выглядит так (используем LuaClassBasedCall ):
Из c++ вызов выглядит так (используем LuaClassBasedCall ):
double result; const char* errmsg = L.PCall("local a,b = ...; return a*b", Inputs(3, 2.5), Outputs(result));Для обратного вызова, используем Lunar. Ну и напоследок, чтобы упростить распаковку и упаковку аргументов обратного вызова из Lua (Lunar), применяем аналогичную технологию шаблонов, как было сделано в LuaClassBasedCall:
template<typename T>и.т.д.
inline void push(lua_State* L, const T& t);
template<typename T>
inline void push(lua_State* L, const T*& t);
template<>
inline void push(lua_State* L, const int& p) {
lua_pushnumber(L, p);
}
template<>
inline void push(lua_State* L, const unsigned int& p) {
lua_pushnumber(L, p);
}
template<>
inline void push(lua_State* L, const long& p) {
lua_pushnumber(L, p);
}
template<>
inline void push(lua_State* L, const unsigned long& p) {
lua_pushnumber(L, p);
}
template<>
inline void push(lua_State* L, const double& p) {
lua_pushnumber(L, p);
}
inline void push(lua_State* L, const char *p) {
lua_pushstring(L, p);
}
template<>
inline void push(lua_State* L, const std::string& p) {
lua_pushlstring(L, p.c_str(), p.length());
}
template<>
inline void push(lua_State* L, const unsigned long long& p) {
push(L, lstrutl::to_str(p));
}
template<>
inline void push(lua_State* L, const bool& p) {
lua_pushboolean(L, p ? 1 : 0);
}
Комментариев нет:
Отправить комментарий