LuaのC++ラッパー
最低限の機能しか無いけど、LuaのC++ラッパーが完成。
はい、テンプレートとか分かりません…
#ifndef _LUA_HPP_ #define _LUA_HPP_ extern "C" { #include "Lua/lua.h" #include "Lua/lualib.h" #include "Lua/lauxlib.h" } #includeclass CLua ; // desc. Luaに登録する自作関数は、このクラスを継承し、Func()をオーバーライドして書く。 class CLuaFunction { // CLuaをフレンドクラスとして登録 friend class CLua; public: CLuaFunction(); virtual ~CLuaFunction(); int GetTop() { return lua_gettop (m_L); } // 引数から値を取得。 // i : 引数の番号 int GetBoolean( int i ) { return lua_toboolean (m_L, i); } int GetNumber( int i ) { return (int)lua_tonumber (m_L, i); } const char* GetString( int i ) { return lua_tostring (m_L, i); } protected: lua_State* m_L; // Lua側で関数が呼ばれると、呼ばれる。returnではスタックに積まれた結果の数を返すこと。 virtual int Func(); private: // Luaから飛んでくるポイント。 static int Entry (lua_State *L); // クラスオブジェクトのアドレスを返す。 CLuaFunction* GetObject() { return this; } }; // desc. Luaのステートを保持しているクラス。 class CLua { public: CLua(); virtual ~CLua(); // Luaステートを取得。 lua_State* GetLuaState() { return m_L; } // Luaに自作関数を登録する。 void RegisterFunc( const char* funcname, CLuaFunction* p ); // こっちは隠し:P void RegisterFunc( const char* name, lua_CFunction func ); // ファイルからLuaスクリプトを読み込み実行。 int LoadScript( const char* filename ); // stringバッファのLuaスクリプトを実行。実行したスクリプトの結果は次に残る。 int ExecScript( const std::string &str ); protected: lua_State* m_L; }; #endif //_LUA_HPP_
使い方の例
#include#include "Lua.hpp" class CMyLuaFunction : public CLuaFunction { int Func() { puts("CMyLuaFunction"); printf( " 引数の数=%d\n", GetTop() ); return 0; } }; void main() { CLua lua; CMyLuaFunction func; lua.RegisterFunc( "foo", &func ); lua.LoadScript( "test.lua" ); }