C++で、Lua側から呼び出された関数の戻り値にtableを設定する方法


動機

自分のプログラムにLuaを組み込もうと思い、さすがにCインターフェースを使うのは嫌だなぁと思っていい感じのライブラリを探して見つけて使ってみたら良さそうな感じだったので採用したが、tableの返し方が分からずハマってしまったので、忘れないように解法を残しておく

要するに

同じようなことで悩んでたissue見つかって、親切にもやり方が書いてあったので解決

sol::object multiply(sol::this_state thislua) {
     sol::state_view existing_state = thislua;
     auto table = existing_state.create_table();
     table["test"] = "好きなように";
     return table;
}

lua["multiply"] = multiply;

要するにこんな感じでtableを作って返す関数を登録して

function ShowTable(t)
    for key, val in pairs(t) do
        if type(val) == "table" then 
            print("key: " .. key .. " table ->")
            ShowTable(val)
        else
            print("key: " .. key .. " val: " .. tostring(val))
        end
     end
end

ShowTable(multiply())

Lua側で登録した関数を呼んであげれば、C++側で作ったtableが返る

コツとしては、登録する関数の引数に "sol::this_state"を受け取るようにすること
そうすることによって、なんやかんやした後に"existing_state.create_table();"を呼び出してtableを作ることが可能になります