如何在 SWIG 中访问声明的模板结构变量



我正在尝试使用 SWIG 3.0.5 从C++生成 Python 定义文件。这些定义是模板化结构,在我的玩具foo.h中定义为:

template<typename T> struct LimitDef
{
    T min;
    T max;
    int otherstuff;
    int etc;
}
namespace ProjectLimits
{
    const LimitDef<int>    Limit1 = {  -5, 100, 42,  0};
    const LimitDef<double> Limit2 = {-1.0, 1.0,  0, 42};
    ...
}

在我相应的foo.i SWIG 界面中,我有:

%module foo
%{
#include "foo.h"
%}
%include "foo.h"
%template(LimitDef_int) LimitDef<int>;
%template(LimitDef_double) LimitDef<double>;

编译为 Python 后,我可以访问新实例化的模板名称(并毫无问题地创建新的LimitDef_int对象(,我可以看到声明的Limit#变量,但类型不对齐 - 已经声明的 var 是裸露的、无法访问的对象指针,没有__swig_getmethods__等:

>>> import foo
>>> newlim = foo.LimitDef_int()
>>> newlim.min = 5
>>> print newlim.min
5
>>> print newlim
<foo.LimitDef_int; proxy of <Swig Object of type 'LimitDef< int > *' at 0x17f2338> >
>>> foo.Limit1
<Swig Object of type 'LimitDef< int> *' at 0x17f2b30>
>>> print foo.Limit1.min
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'SwigPyObject' object has no attribute 'min'
>>> dir(foo.Limit1.min)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__hex__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__ne__', '__new__', '__oct__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'acquire', 'append', 'disown', 'next', 'own']

我尝试将 %template 指令移动到 %include "foo.h" 之前,以便在解析声明的 var 时新的实例化模板定义就位,但是当我尝试构建时,我遇到了Error: Template 'LimitDef' undefined

我尝试%extend特定的模板类型以提供访问器(因为这是我真正需要的(,例如:

%extend LimitDef<int> {
    int get_min() { return (*$self).min; }
};

但同样,这仅适用于新创建的LimitDef_int类型及其实例; Limit1等不受影响(即使%extend块在%include "foo.h"之前(。

我不太关心创建新实例,因为我能够访问那些现有的Limit#变量。如果可能的话,我不想修改源代码;我的实际项目文件定义了 100+ 个这样的常量。

我错过了什么,可以让我有foo.Limit1.min回报-5

SWIG 手册 - 36.3.3 [蟒蛇;全局变量]

为了提供对 C 全局变量的访问,SWIG 创建了一个名为 cvar 的特殊对象,该对象将添加到每个 SWIG 生成的模块中。然后,全局变量作为此对象的属性进行访问。

因此,Limit1的代理对象可以在 foo.cvar.Limit1 中找到。

参见 C/C++ 全局变量是如何在 python 中实现的?

相关内容

  • 没有找到相关文章

最新更新