LuaStickを使ってLuaとC++をバインドする


LuaStickはWindows上で動作する、LuaとC++をバインドするコード生成プログラムです。
C++の関数・クラス・列挙等の直前に
/// <stick export="true" />
を書くだけでLuaにエクスポートできます。

元々Dynamic DrawとLuaをバインドするために書いたものですが、使い勝手が良いので最近公開しました。

LuaStickを使うことで以下が可能になります。
- C++上の関数、クラス、列挙等をLuaプログラム中で操作できるようになります。
- C++からLuaの関数を実行することができるようになります。
- Luaに公開されるC++の機能に関するマニュアルを自動生成します。

以下は、main.h のクラス'X'とメンバー関数'Func'をエクスポートする例です。

// main.h

/// <stick export="true" />
class X
{
    /// <stick export="true" />
    /// <param name="x" io="in" />
    void Func(int x)
    {
        std::cout << x * 2;
    }
};

main.h とLuaをバインドするためのコードを生成させるには、LuaStick.exeを以下のコマンドラインで実行します。

>LuaStick.exe -out Stick Sticklib.h main.h

実行の結果、LuaStick.exeは、Stick.h、Stick.cpp、Stick.htmlを生成します。

     +--------------------------------+          Manual
     |          Application           |      +------------+  Generate
     |                                |      | Stick.html |<---------+
     |   +----------+  +----------+   |      +------------+          |
     |   |Stickrun.h|  |Sticklib.h|---|---+                          |
     |   +----------+  +----------+   |   |       +--------------+   |
     |   +----------+  +----------+   |   +------>|              |---+
     |   | main.cpp |  | main.h   |---|---------->| LuaStick.exe |------+
     |   +----------+  +----------+   |           |              |---+  |
     |                                |           +--------------+   |  |
     |   +----------+  +----------+   |      Generate                |  |
     |   |liblua.lib|  | Stick.h  |<--|------------------------------+  |
     |   +----------+  +----------+   |                                 |
     |        :        +----------+   |      Generate                   |
     |                 |Stick.cpp |<--|---------------------------------+
     |                 +----------+   |
     +--------------------------------+

以下の main.cpp は、Luaのスクリプトからクラス'X'のインスタンスを作成し関数'Func'を実行します。

// main.cpp

#include "Stick.h"

int main()
{
    Stickrun stickrun(luastick_init);
    std::string lua_src =
      "obj=X.New();"
      "obj:Func(10);";
    stickrun.DoString(nullptr, lua_src, "myscript");
}

<summary>等のタグを記載することで、生成されるマニュアルのコンテンツを充実させることができます。

// main.h

/// <stick export="true" />
/// <summary>
/// クラスXの機能です。
/// </summary>
class X
{
    /// <stick export="true" />
    /// <summary>
    /// クラスXのメンバー関数です。
    /// </summary>
    /// <param name="x" io="in">パラメーターxです</param>
    /// <returns>xの2倍の値を返します</returns>
    int Func(int x)
    {
        return x * 2;
    }
};

詳しくはマニュアル、及びサンプル集をご覧ください。
ソースコードはこちらです。
Windowsのバイナリーはこちらからダウンロードできます。