SWIG / Lua:确定成员字段数据类型
Posted
技术标签:
【中文标题】SWIG / Lua:确定成员字段数据类型【英文标题】:SWIG / Lua: Determine member field data type 【发布时间】:2009-10-01 15:46:00 【问题描述】: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 函数在验证参数时具有正确的数字字段字符串表示形式。
感谢您的帮助!
【问题讨论】:
你期望输出什么而不是“数字”——你期望“年龄”吗? 我正在尝试获取数据类型,即“num_years”或“num_years *”。我已经可以得到变量名了。 【参考方案1】:SWIG 包装的 C++ 对象是符合特定规则集的 Lua 用户数据对象。 swig_type()
通过窥视这些用户数据对象并检索 SWIG 存储在那里的类型名称信息来工作。但是age
是直接表示的,所以没有类型名称字段可供查找,所以swig_type()
不能发挥它的魔力。您可以通过使 num_years 成为包装 int 的不透明类类型(并且可能定义一些隐式转换以便在 C++ 中使用)来获得您想要的东西,但是为了获得可疑的回报,要做很多工作。
get 和 set 函数的工作机制完全不同;它们具有正确的签名,因为 SWIG 在编译时将其存储在生成的包装器中,从接口文件中复制。
【讨论】:
【参考方案2】:我知道这已经很老了,但我想我会给出一个可能的答案。
将年份包装在如下结构中:
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;
;
【讨论】:
以上是关于SWIG / Lua:确定成员字段数据类型的主要内容,如果未能解决你的问题,请参考以下文章
使用 SWIG 在 Python 中公开 std::list 成员