趣味で作ってるロボット用ソフトウェア
 All Classes Files Functions Enumerations Enumerator Friends Pages
lua と C++ を組み合わせて利用する

Lua から C++ のクラスを利用する

C++ のプログラムから Lua プログラムを読み込み、C++ から Lua スクリプトの関数を呼び出しています。

#include <string>
#include <iostream>
#include <lua.hpp>
#include <luabind/luabind.hpp>
using namespace luabind;
using namespace std;
int main(int argc, char *argv[])
{
static_cast<void>(argc);
static_cast<void>(argv);
// Lua, Luabind の初期化
lua_State* lua = luaL_newstate();
luaL_openlibs(lua);
luabind::open(lua);
// Lua スクリプトのロード
if (luaL_dofile(lua, "hello_function.lua")) {
string error_message = lua_tostring(lua, -1);
cout << "loadL_dofile: " << error_message << endl;
return 1;
}
try {
call_function<void>(lua, "hello");
} catch (const error &e) {
static_cast<void>(e);
cout << "hello(): " << lua_tostring(lua, -1) << endl;
}
return 0;
}

hello_function.lua

-- use_function_from_lua.cpp で利用する
function hello()
print("hello in lua")
end

Lua から C++ のクラスを利用する

C++ のプログラムから Lua プログラムを読み込み、C++ のクラスを Lua スクリプトから呼び出しています。

#include <string>
#include <iostream>
#include <lua.hpp>
#include <luabind/luabind.hpp>
using namespace luabind;
using namespace std;
namespace
{
class Hello
{
public:
void world(void)
{
cout << "hello, world." << endl;
}
};
extern void hello_world(void)
{
cout << "hello, world." << endl;
}
void register_class_to_lua(lua_State* lua)
{
module(lua)
[
class_<Hello>("Hello")
.def(constructor<>())
.def("world", &Hello::world),
def("hello_world", &hello_world)
];
}
}
int main(int argc, char *argv[])
{
static_cast<void>(argc);
static_cast<void>(argv);
// Lua, Luabind の初期化
lua_State* lua = luaL_newstate();
luaL_openlibs(lua);
luabind::open(lua);
// Lua スクリプトに対して C++ のクラスを登録する
register_class_to_lua(lua);
// Lua スクリプトを実行する
if (luaL_dofile(lua, "hello_class.lua")) {
string error_message = lua_tostring(lua, -1);
cout << "loadL_dofile: " << error_message << endl;
return 1;
}
return 0;
}

hello_class.lua

-- use_function_from_lua.cpp で利用する
local hello = Hello()
hello:world()
hello_world()