SWIG慷慨地提供了swig_type()函数来获取传递的userdata对象的数据类型的字符串表示。但是,对于成员字段,SWIG和Lua认为这些是简单的“数字”项,因此只打印“数字”而不是数据类型的名称。
e.g。
typedef num_years int;
class Person
{
public:
Person * spouse;
num_years age;
};
C ++中的会导致:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> p = MyModule.Person();
> print(swig_type(p.spouse));
Person *
> print(swig_type(p.age));
number
我可以采取一些后门路线来确定成员字段的数据类型吗?我看到get和set函数在验证参数时具有数字字段的正确字符串表示。
感谢您的帮助!
答案 0 :(得分:3)
SWIG包装的C ++对象是符合特定规则集的Lua userdata对象。 swig_type()
通过查看这些userdata对象并检索SWIG存储在那里的类型名称信息来工作。但age
是直接表示的,因此没有要查找的类型名称字段,因此swig_type()
无法发挥其魔力。你可以通过使num_years成为一个包含int的不透明类类型来获得你想要的东西(并且它可能定义了一些隐式转换以便于在C ++中使用),但这需要付出很多努力来获得可疑的奖励。
get和set函数的工作方式完全不同;它们具有正确的签名,因为SWIG在编译时将其存储在生成的包装器中,从接口文件复制。
答案 1 :(得分:0)
我知道这是超级老,但我想我会给出一个可能的答案。
将年份包含在以下结构中:
struct year_t
{
year_t(int year) : m_year(year) {}
void operator()(int year) { m_year = year; }
int operator()() const { return m_year; }
private:
int m_year;
}
class Person
{
public:
Person * spouse;
year_t age;
};