【发布时间】:2017-03-14 10:54:43
【问题描述】:
我想包装一个结构的静态成员变量,以便在从 Python 读取或写入它时,在 C++ 端调用自定义 get/set 函数。以下适用于非静态变量。这是foo.h:
#ifndef FOO_H
#define FOO_H
#include <iostream>
struct Foo
{
static int bar() { std::cout << "Foo::bar()\n"; return 0; }
};
#endif
foo.i 如下所示:
%module foo
%{
#include "foo.h"
%}
struct Foo
{
};
%extend Foo {
int i;
}
%{
int Foo_i_get(Foo* obj) {
return Foo::bar();
}
void Foo_i_set(Foo* obj, int i) {}
%}
这种工作,在 Python 中我可以做到:
import foo
f = foo.Foo()
f.i
这会触发 Foo::bar() 被调用。我想要实现的是具有相同行为的以下内容:
import foo
foo.Foo.i
这不起作用,因为i 不是类属性。
我天真地尝试在.i 文件中更改以下内容:
%extend Foo {
static int i;
}
这会在 SWIG 生成的以下包装器代码中产生编译错误:
SWIGINTERN PyObject *Swig_var_Foo_i_get(void) {
PyObject *pyobj = 0;
pyobj = SWIG_From_int((int)(Foo::i));
return pyobj;
}
这是g++给出的错误信息:
foo_wrap.c: In function ‘PyObject* Swig_var_Foo_i_get()’:
foo_wrap.c:3208:31: error: ‘i’ is not a member of ‘Foo’
pyobj = SWIG_From_int((int)(Foo::i));
所以显然这不是正确的方法。如何使用静态变量、自定义 setter 和 getter 扩展结构?
【问题讨论】:
-
即使没有
%extendSWIG 实际上也不会使类的静态成员可以通过foo.Foo.i语法访问。我敢肯定,我们可以通过一些解决方法来做一些事情,但这不会是微不足道的。