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

SWIG慷慨地提供了swig_type()函数来获取传递的用户数据对象的数据类型的字符串表示。但是,在成员字段的情况下,SWIG和Lua认为它们只是简单的“数字”项,因此只打印“数字”,而不是数据类型的名称。

例如,

typedef num_years int;

class Person
{
    public:
           Person * spouse;
           num_years   age;
};

在C++中将导致:

Lua 5.1.4  版权所有(C)1994-2008 Lua.org,PUC-Rio

> p = MyModule.Person();
> print(swig_type(p.spouse));
Person *
> print(swig_type(p.age));
number

是否有一些后门路径可以采取来确定成员字段的数据类型?当验证参数时,我看到获取和设置函数具有数字字段的正确字符串表示。

感谢任何帮助!

原文链接 https://stackoverflow.com/questions/1504747

点赞
stackoverflow用户121674
stackoverflow用户121674

SWIG 封装的 C++ 对象是符合特定规则的 Lua userdata 对象。 swig_type() 函数通过查看这些 userdata 对象并检索 SWIG 存储在其中的类型名称信息来工作。但是 age 直接表示,所以没有类型名称字段可供查找,因此 swig_type() 无法使用其魔法。您可以通过将 num_years 定义为封装 int 的不透明类类型(也许在 C++ 中定义一些隐式转换以方便使用),来获得所需的结果,但这需要很多努力以获得可疑的回报。

获取和设置功能的工作机制完全不同。它们具有正确的签名,因为 SWIG 在编译时在生成的包装程序中存储它,并从接口文件进行复制。

2009-10-07 20:43:55
stackoverflow用户702713
stackoverflow用户702713

我知道这份代码非常老旧,但我想我可以提供一个可能的解答。

将年份包装在如下结构体中:

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-04 12:58:46