Luabind: 无法返回 shared_ptr。
2013-2-23 6:46:47
收藏:0
阅读:139
评论:1
我试图从一个绑定了 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();
}
}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我不得不解决同样的问题。
这有点复杂。基本上,你需要定义原型为
template <typename T> T* get_pointer(std::shared_ptr<T> const&);的函数。此外,该函数必须和
std::shared_ptr处于同一个命名空间中,也就是std::。注意,如果你将函数定义在全局命名空间或者luabind命名空间中,就像你现在的那样,是行不通的。因为luabind使用特殊技巧来确保只有使用ADL(Argument-dependent lookup)来检查某个类型是否为smart pointer(见has_get_pointer.hpp)。唯一的解决办法是在luabind::detail::has_get_pointer_命名空间中定义你的函数,而不是仅仅在luabind命名空间中。但是,仅仅在
luabind::detail::has_get_pointer_命名空间中定义你的函数是行不通的(至少对于Boost版本低于1.53的情况是这样)。虽然在std命名空间中定义函数在技术上不符合C++标准,但这是低于Boost 1.53的唯一可能的方法。然而,自1.53版本以来,Boost定义了自己的boost::get_pointer()重载,用于std::shared_ptr(以及std::unique_ptr)。对于这个版本,将Boost的get_pointer()可见于luabind::detail::has_get_pointer_命名空间就足够了,因为luabind在使用smart指针时会使用此函数(请查看luabind/get_pointer.hpp头文件)。在std中定义此函数甚至也行不通,因为luabind会引发一个二义性调用。因此,如果你想要在Boost <1.53和>= 1.53以及MSVC 10(和可能是9)(这些在
std::tr1而不是std中定义shared_ptr)中使用std::shared_ptr的get_pointer()重载,我可以提供我的(有历史以来的;-))头文件:#ifndef SHAREDPTR_CONVERTER_HPP_INCLUDED #define SHAREDPTR_CONVERTER_HPP_INCLUDED SHAREDPTR_CONVERTER_HPP_INCLUDED #include <boost/version.hpp> #if BOOST_VERSION >= 105300 #include <boost/get_pointer.hpp> namespace luabind { namespace detail { namespace has_get_pointer_ { template<class T> T * get_pointer(std::shared_ptr<T> const& p) { return p.get(); } }}} #else // if BOOST_VERSION < 105300 #include <memory> // Not standard conforming: add function to ::std(::tr1) namespace std { #if defined(_MSC_VER) && _MSC_VER < 1700 namespace tr1 { #endif template<class T> T * get_pointer(shared_ptr<T> const& p) { return p.get(); } #if defined(_MSC_VER) && _MSC_VER < 1700 } // namespace tr1 #endif } // namespace std #endif // if BOOST_VERSION < 105300 #endif