воскресенье, 20 ноября 2011 г.

Простой способ использования Lua в программе на c++

Пересмотрев большинство библиотек, предназначенных для вызова Lua из C++ и наоборот, пришел к выводу что наиболее удачным и простым будет сочетание LuaClassBasedCall и Lunar.
Из 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);
}
и.т.д.

Комментариев нет:

Отправить комментарий