如何用swig包装operator +函数?

时间:2013-07-26 09:55:02

标签: c++ operators swig

我试图包装bullet lib的btVector3类的operator +函数。 operator +未定义为类成员,而是作为函数定义。

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

我尝试使用extend:

%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__'

1 个答案:

答案 0 :(得分:1)

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

如果你想放弃self / this参数,通常你可以在C ++中创建类似static的东西。这在我刚刚使用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)