使用基础类型设置派生类型的属性的Luabind。

我正在使用 LuaBind 将 c++ 类暴露给 Lua 脚本。我遇到了一个问题,即无法将基类转换为其派生类。我有一个工厂类,它返回基类型的对象。我正在尝试使用这些对象设置派生自基类型的某些类型的字段。我已将我的问题化简为一些测试代码,可以重现该问题并清楚地解释它。

c++ 类定义

class Base {
public:
  virtual void say() { cout << "a" << endl; }
};

class Derived : public Base {
public:
  virtual void say() { cout << "b" << endl; }
};

class TestClass {
public:
  Base *GetBase() { return (Base *)new Derived(); }
  Derived *derivedRef;
};

c++ LuaBind 绑定代码

module(L)[
    class_<Base>("Base")
    .def(constructor<>())
    .def("say", &Base::say)];

module(L)[class_<Derived, Base>("Derived")
    .def(constructor<>())
    .def("say", &Derived::say)];

module(L)[class_<TestClass>("TestClass")
    .def(constructor<>())
    .def("GetBase", &TestClass::GetBase)
    .def_readwrite("derivedRef", &TestClass::derivedRef)];

Lua 代码

testClass = TestClass()
base = testClass:GetBase()
testClass.derivedRef = base

错误

 occurred executing a LUA script: No matching overload found, candidates:
 void <unknown>(TestClass&,Derived* const&)

有人知道在 LuaBind 中是否可能进行向上转型,如果可能的话,我应该如何去做?

点赞
用户1153203
用户1153203

经过长时间的过程,我解决了这个问题。

首先,我在 这里 打算运行的 LuaBind 版本 (0.9) 支持在传递参数时自动向下/向上转换类型。这表明是可能的。

然后,我在 这里 发现了一个特殊的头文件,用于转换共享指针 (我意识到我正在使用它)。Luabind 附带的转换器仅适用于 boost 共享指针。很容易获取 boost 智能指针转换器的源代码 并将所有 boost:: 实例替换为 std::,并做出一些小修改,使其能够编译。

然后,当我调用 bind 方法时,我开始收到以下错误消息:

std::runtime_error: 'Trying to use unregistered class'

这里有一个共享指针转换器的版本 here,但它在我的机器上无法编译。我将其用作参考,制作了另一个头文件,允许 Luabind 绑定来自标准库的共享指针。

长话短说,只需包含以下两个文件,当您使用标准库版本而不是 boost 版本时,共享指针的自动向上/向下转换将起作用。

我使用 Xcode 5 和 clang 编译器,并没有测试使用其他编译器。

2014-05-10 17:49:28