如何在SWIG包装C++代码中向目标语言(特别是Python)添加替代构造函数
How to add an alternative constructor to the target language (specifically Python) in SWIG wrapping C++ code
我正在使用SWIG为一些无法更改的C++代码创建Python接口。其中一个C++类有一个构造函数,它创建了一个尚未使用的部分初始化对象,必须首先对其调用初始化函数。我想在Python中通过提供一个替代构造函数来弥补这一点,该构造函数同时处理两件事(获取和初始化)。假设在C++中我有
class X {
public:
X() {...}
void init(T a) {...}
...
};
在C++中,我必须将X实例化为
X x;
x.init(a);
在Python中,我想做
x = X(a)
我的解决方案是一个取决于目标语言和SWIG生成包装器代码的特定方式的破解:在我的.i文件中,我有
%inline %{
X* new_X(T a) {
X* ret = new X();
ret->init(a);
return ret;
}
%nodefaultctor X;
class X {
public:
...
%extend {
%pythoncode {
def __init__(self, *args):
this = _modulename.new_X(*args)
try:
self.this.append(this)
except:
self.this = this
}
}
};
这很好,但不是很令人满意:
- 这取决于SWIG如何在内部封装构造函数
- 它完全依赖于目标语言
这似乎是一个相对常见的用例,那么有人知道是否有标准的方法吗?
V-master当前的答案不能正常工作。但它可以工作:
%ignore X::X();
// declaration of class X, e.g. %include X.h
%extend X {
X(T a) {
X* newX = new X();
newX->init(a);
return newX;
}
};
诚然,这看起来有点可疑,但它确实有效,本质上是SWIG文档中的一个例子。
需要注意的是:
%extend可以同时使用C和C++代码。它不会以任何方式修改底层对象——扩展只显示在Python接口中。
因此,这实际上是创建一个方法(实际上甚至不是类方法)来创建X
的新实例,调用init(a)
并返回它。因为语法有点像构造函数,SWIG会将其包装成这样。
您可以尝试以下操作:
%ignore X::X();
%extend X {
X(T a) {
init(a);
}
};
这将隐藏默认的无参数构造函数,并添加采用T
的新构造函数
不利的一面是,如果被忽略的构造函数正在做一些事情,那么您需要将其复制到这个新构造函数中,因为您不能从同一类构造函数中调用其他构造函数(除非您使用的是C++11)
相关文章:
- 我刚刚安装了Visual Studio,遇到了一些错误,特别是WindowsSDKDir属性未定义.可能找不到某些生成工
- 平均循环值(特别是 HSL 配色方案中的色调)
- 如何通过函数参数使用 fstream(特别是 ofstream)
- 使用 C/C++ 以外的语言构建共享库,特别是 prolog
- 是否提供了在linux上交叉编译gtkmm(特别是v3)windows库/应用程序的说明
- GCC 地址清理器 - 将库功能列入黑名单(特别是 boost::test)
- std::bind通常适用于仅移动类型,特别是std::unique_ptr
- 当我可以将RNG传递给分发时,为什么要使用variate_generator?(特别是C++和Boost)
- 了解函数特征模板的工作原理.特别是,指向成员函数的指针是怎么处理的
- 如何在C++中使用%d,特别是在DrawText()中
- 如何在SWIG包装C++代码中向目标语言(特别是Python)添加替代构造函数
- 如何将c合并到c中(特别是lex)
- C++-占位符是如何工作的(特别是在boost::type_erasure中)
- 如何在xml树中反向行走节点,特别是libxml/c++
- 当您泄漏"device"和"device context"时会发生什么 - 特别是 d3d?
- 转换到另一个库(特别是c++)
- 我迷失在提升库中(特别是boost_program_options)
- msys/MinGW,即使安装了也找不到libpng,试图编译xpdf(特别是pdftopng)
- 并发与并行——特别是在c++中
- 矢量化/优化循环,用于宽寄存器(特别是Xeon Phi)的未对齐数据访问