SWIG / Lua:确定成员字段数据类型

时间:2009-10-01 15:46:01

标签: types lua swig

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函数在验证参数时具有数字字段的正确字符串表示。

感谢您的帮助!

2 个答案:

答案 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;
};