Luabind:无法返回shared_ptr

时间:2013-02-23 06:46:47

标签: c++ lua shared-ptr luabind

我正在尝试从与Luabind绑定的方法返回std :: shared_ptr,但它似乎无法识别该类型。

Luabind代码:

module(lua)
[
    class_<Character, BaseEntity, std::shared_ptr<Character> > ("Character"),
        def("createCharacter", &Character::createCharacter)
];

createCharacter代码:

std::shared_ptr<Character> Character::createCharacter(Game* gameInstance, const Character::CharacterSetup& characterSetup, string sprite, b2World* world)
{
    return std::shared_ptr<Character>(new Character(gameInstance, characterSetup, sprite, world));
}

如果我在Lua脚本中调用此方法,则不会返回任何内容,并且执行将在那里停止。但是,如果我更改方法以返回Character *,它将按预期工作。一些谷歌搜索告诉我,返回shared_ptr应该不是问题。

我做错了什么?

另外,我有这个代码,所以Luabind可以理解std :: shared_ptr:

namespace luabind
{
    template <typename T>
    T* get_pointer(std::shared_ptr<T> const& p)
    {
        return p.get();
    }
}

1 个答案:

答案 0 :(得分:4)

我必须解决同样的问题。

这有点复杂。基本上你需要用原型

定义一个函数
template <typename T>
T* get_pointer(std::shared_ptr<T> const&);

此函数还必须与std::shared_ptr位于同一名称空间中,因此std::。请注意,全局命名空间或luabind命名空间中的函数与您的无效,因为luabind使用special tricks来确保仅检查某个类型是否为智能指针时使用ADL。避免这种情况的唯一方法是在luabind::detail::has_get_pointer_命名空间中定义您的函数,而不仅仅是luabind

但是,仅在此命名空间中定义您的函数也不会起作用(至少对于Boost&lt; 1.53)。尽管在C ++标准中技术上不允许在命名空间std中定义函数,但它是Boost&lt; 1.53的唯一可行方法。但是,从1.53开始,Boost为boost::get_pointer()(和std::shared_ptr)定义了自己的std::unique_ptr重载。对于这个版本,它足以使get_pointer()命名空间中的Boost luabind::detail::has_get_pointer_可见,因为luabind在使用智能指针的任何地方都是using(参见luabind/get_pointer.hpp标题)。定义std中的函数甚至不会起作用,因为luabind会引起一个模糊的调用。

因此,如果您希望get_pointer()的{​​{1}}重载适用于Boost&lt; 1.53和&gt; = 1.53以及MSVC 10(可能是9)(这些定义std::shared_ptrshared_ptr而不是std::tr1)中,我可以为您提供我的(历史性增长;-))标题:

std