2

SWIG 慷慨地提供了 swig_type() 函数来获取传递的 userdata 对象的数据类型的字符串表示形式。但是,对于成员字段,SWIG 和 Lua 将它们视为简单的“数字”项,因此仅打印“数字”而不是数据类型的名称。

例如

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

感谢您的帮助!

4

2 回答 2

3

SWIG 包装的 C++ 对象是符合特定规则集的 Lua 用户数据对象。 swig_type()通过查看这些用户数据对象并检索 SWIG 存储在那里的类型名称信息来工作。但是age是直接表示的,所以没有类型名称字段可以查找,所以swig_type()不能发挥它的魔力。您可以通过使 num_years 成为包装 int 的不透明类类型(并且可能定义一些隐式转换以便在 C++ 中使用)来获得您想要的东西,但是为了获得可疑的回报,需要做很多工作。

get 和 set 函数通过完全不同的机制工作;它们具有正确的签名,因为 SWIG 在编译时将其存储在生成的包装器中,从接口文件中复制。

于 2009-10-07T20:43:55.227 回答
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;
};
于 2016-08-04T12:58:46.840 回答