2

我正在尝试包装子弹库的 btVector3 类的 operator+ 函数。operator+ 没有定义为类成员,而是定义为函数。

包装 operator+= 这是一个类方法工作正常。如果我在 swig 接口文件中声明 operator+(我只能在类定义之外执行此操作),swig 不会将其识别为属于该类的运算符。

我尝试使用扩展:

%extend btVector3
{
    btVector3 __add__(const btVector3& v1, const btVector3& v2) { return operator+(v1, v2); }  
};

这导致 swig 为 btVector3 生成 python __add__ 方法。但是,我确实收到以下运行时错误:

AttributeError: 'module' object has no attribute 'btVector3___add__'
4

1 回答 1

1

您尝试的问题是生成的__add__函数是非静态的,因此实际上需要 3 个参数:(self, v1, v2).

static如果你想放弃 self/this 参数,通常你可以在 C++ 中做类似的事情。这似乎不适用于我刚才使用 SWIG/Python 进行的测试。我认为这是因为 Python 中的类范围函数,即使使用特定实例而不是没有实例调用时也不会self传入参数,因此最终会丢失参数。

解决方案是将其编写为常规旧成员函数的%extend版本。__add__一个最小的例子:

%module test

%inline %{
 struct btVector3 {
   double v[3];

   btVector3 add_vec(const btVector3& b) {
     // Or call your other operator here instead.
     btVector3 ret;
     for (int i = 0; i < 3; ++i)
       ret.v[i] = v[i]+b.v[i];
     return ret;
   }

 };
%}

%extend btVector3 {
 btVector3 __add__(const btVector3& b) {
   btVector3 ret;
   for (int i = 0; i < 3; ++i)
     ret.v[i] = $self->v[i]+b.v[i];
   return ret;
 }
}

这足以让我像这样使用它:

import test

print(dir(test))

a=test.btVector3()
b=test.btVector3()
c=a+b
print(c)
于 2013-07-26T20:52:47.023 回答