通过C&x2B+;对象到Lua函数 我有一个C++项目,其中1类的1种方法经常发生变化。所以我想从C++到Lua。注意,我是Lua的新手

通过C&x2B+;对象到Lua函数 我有一个C++项目,其中1类的1种方法经常发生变化。所以我想从C++到Lua。注意,我是Lua的新手,c++,lua,C++,Lua,整个任务: 将一些类方法绑定到Lua状态机 将对类对象的引用传递给用Lua编写的函数 < LI>在Lua函数中运行通过C++对象。 我已经找到了如何在月球上迈出第一步,却无法应付第二步和第三步 我不能使用SWIG和boost。你看了吗?它使得将C++对象和函数暴露给Lua非常容易。 < P>像约翰,我已经使用过并推荐它。然而,由于使用boost不是您的选择,您可能会发现它很有用。您可能还想查看 页面上提到的一个库是,它没有依赖项(如它所说) 我可以发布大量关于如何使公开更容易,以及如何进行继承等

整个任务:

  • 将一些类方法绑定到Lua状态机
  • 将对类对象的引用传递给用Lua编写的函数 < LI>在Lua函数中运行通过C++对象。
  • 我已经找到了如何在月球上迈出第一步,却无法应付第二步和第三步

    我不能使用SWIG和boost。

    你看了吗?它使得将C++对象和函数暴露给Lua非常容易。

    < P>像约翰,我已经使用过并推荐它。然而,由于使用boost不是您的选择,您可能会发现它很有用。您可能还想查看

    页面上提到的一个库是,它没有依赖项(如它所说)

    我可以发布大量关于如何使公开更容易,以及如何进行继承等方面的详细信息,如果您想要公开多个T(我认为最常见的解决方案是一个简单的
    struct{std::auto_ptr,int type}
    deal),则需要对其进行修改。但是,如果你对这个过程一无所知,这应该是一个起点

    基本上,首先,我们要求Lua分配一些空间(userdata),然后将T放入其中。当调用CallSomeFuncOnT时,我们首先询问它是否有一个表(许多Lua类都是基于表的,因为它们支持面向对象、元表等),然后获取用户数据,然后将其转换为指向对象的指针,然后转换为引用。记住,lua_Tuserdata给了你一个空白*,所以你最好他妈的确定另一端是什么。然后我们调用somefunc并返回。 大体上,我们只是将函数注册为全局函数


    现在,在Lua中,当您调用CreateInstanceOfT时,它实际上只是调用T构造函数,对Lua用户是透明的。然后我们将它丢弃在一个表中,这对于Lua新手来说更简单,通过将它传递到这个表来调用SomeFunc

    是的,我有。正如上面提到的,它使用boostI,我简直不敢相信,我需要一些库来实现如此简单的操作。请记住,您可以始终使用luaapi,自己进行绑定。库是为了使C++类绑定到Lua更容易,是错误的,还是真的,t的析构函数从来没有使用这个技术调用过?据我所知,Lua对C++对象一无所知,只调用它控制的内存< <代码>免费>代码>,例如由代码> LuaAuxNeUsReDATAs//>代码分配的。可能还有很多其他有用的部分。
    //This has a large number of steps, but I'm gonna post them all. This is all using native Lua 5 and the lua CAPI.
    int CreateInstanceOfT(lua_State* L) {
        new (lua_newuserdata(L, sizeof(T))) T(constructor args);
        return 1;
    }
    int CallSomeFuncOnT(lua_State* L) {
        if (lua_istable(L, 1)) { // If we're passed a table, get CData
            lua_getfield(L, 1, "CData");
            lua_replace(L, 1);
        }
        if (!lua_touserdata(L, 1))
            lua_error(L); // longjmp out.
        T& ref = *(T*)lua_touserdata(L, 1);
        ref.SomeFunc(); // If you want args, I'll assume that you can pass them yourself
        return 0;
    }
    int main() {
        lua_State* L = luaL_newstate();
        lua_pushcfunction(L, CreateInstanceOfT);
        lua_setglobal(L, "CreateInstanceOfT");
        lua_pushcfunction(L, CallSomeFuncOnT);
        lua_setglobal(L, "CallSomeFuncOnT");
        luaL_dofile(L, "something.lua");
        lua_close(L);
    }
    -- Accompanying Lua code: semicolons are optional but I do out of habit. In something.lua
    function CreateCInstance()
        local Instance = {
            CData = CreateInstanceOfT();
            SomeFunc = CallSomeFuncOnT;
        }
        return Instance;
    end
    
    local object = CreateCInstance();
    object:SomeFunc(); // Calls somefunc.