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

时间:2014-05-10 04:08:25

标签: c++ binding casting lua 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 Code

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

错误

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

有人知道在LuaBind中是否有可能进行向上转换,如果可以,我该如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

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

首先我读here我运行的LuaBind版本(0.9)应该支持在传递给参数时自动向下/向上转换类型。这表明它是可能的。

然后我发现here有一个特殊的标题包括转换共享指针(我意识到我正在使用)。 LuaBind附带的转换器仅适用于boost共享指针。获取source for the boost smart pointer converter并使用std ::和make a few small modifications替换boost ::的每个实例非常简单,因此它将进行编译。

然后我开始收到错误说

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

当我调用绑定方法时。

有一个版本的共享指针转换器here,但它没有在我的机器上编译。我使用它作为参考来创建另一个header file,它允许LuaBind绑定标准库中的共享指针。

总而言之,当您使用标准库版本而不是升级版本时,请包含以下两个文件并自动向上/向下转换共享指针。

我正在使用带有clang编译器的Xcode 5,而我没有使用其他编译器对其进行测试。