tolua 转换 std::shared_ptr

tolua 转换 std::shared_ptr 

 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用

std::shared_ptr<Tst_ShareTest> createObject(); 

类似这样的函数在tolua的转换稍稍有些麻烦,今天做了两个实验,下面简单做个总结,由于进度紧张,这里只是做个笔记,没有详细的叙述和严谨的逻辑,如有问题留言。首先在cpp文件中写出要转换的类如下:

namespace Test {

class Tst_ShareTest
{
public:
    void func()
    {
        std::cout << "TEST!!!!!!" << std::endl;
    }
};

std::shared_ptr<Tst_ShareTest> createObject()
{
return std::make_shared<Test::Tst_ShareTest>();
} }

 

1. 第一种思路是利用 std::shared_ptr 中的get()函数获取对象指针,再使用,pkg文件中做如下定义

namespace std
{
class shared_ptr
{
TOLUA_TEMPLATE_BIND(T, Test::Tst_ShareTest)
     T *get() const;
};
}

可以看到转换后的代码类似如下

  const std::shared_ptr<Test::Tst_ShareTest>* self = (const std::shared_ptr<Test::Tst_ShareTest>*)  tolua_tousertype(tolua_S,1,0);

 {
  Test::Tst_ShareTest* tolua_ret = (Test::Tst_ShareTest*)  self->get();
  tolua_pushusertype(tolua_S,(void*)tolua_ret,"Test::Tst_ShareTest");
 }

也就是说,转换后的代码会生成一个self对象,用这个对象调用get(),因此我们可以在lua代码中这样调用

oj = Test.createObject()
local ojsh = tolua.cast(oj, "std::shared_ptr<Test::Tst_ShareTest>")
ojp = ojsh:get()
ojp:func()

2. 思路二,不想让lua和pkg文件跟std::shared_ptr有太多关联,可以试试用typedef重新定义std::shared_ptr类型。

typedef std::shared_ptr<Tst_ShareTest> ShareTestPtr;

在pkg文件中做如下定义:

class ShareTestPtr
{
public:
    Tst_ShareTest *get() const;
}

Test::ShareTestPtr createObject2();

在lua中调用方法如下:

oj2 = Test.createObject2()
local ojsh2 = tolua.cast(oj2, "Test::ShareTestPtr")
ojp2 = ojsh2:get()
ojp2:func()

 

posted on 2017-03-12 13:43  dangerman  阅读(695)  评论(0编辑  收藏  举报

导航