2013-07-26 1 views
2

글 머리 기호 lib의 btVector3 클래스의 operator + 함수를 래핑하려고합니다. operator +는 클래스 멤버로 정의되지 않고 함수로 정의됩니다.연산자 + 함수를 어떻게 swig로 래핑 할 수 있습니까?

래핑 연산자 + = 클래스 메소드가 잘 작동합니다. swig 인터페이스 파일에서 연산자 정의를 선언하면 (클래스 정의 외부에서만 수행 할 수 있음) swig는 이것을 클래스에 속하는 연산자로 인식하지 못합니다.

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

이 btVector3위한 파이썬 __add__ 방법을 생성하는 통음 이어진다

난 연장 사용하려고. 나는 그러나 다음과 같은 런타임 에러가 발생합니까 :

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

답변

1

당신의 시도에 대한 문제가 발생 __add__ 함수가 비 정적이라는 것이다 따라서 실제로 3 개 인수를 취합니다 (self, v1, v2)합니다.

대개 자기 /이 인수를 삭제하려면 보통 static과 같은 것을 C++로 만들 수 있습니다. 그것은 지금 SWIG/Python으로 테스트 한 결과 작동하지 않는 것 같습니다. 나는 이것이 인스턴스가 아닌 특정 인스턴스와 함께 호출 될 때에도 self 매개 변수가 전달되지 않아서 파이썬에서 클래스 범위 함수가 전달 되었기 때문에 이것이 인수가 누락 될 것이기 때문이라고 생각합니다.

해결책은 일반 이전 구성원 기능으로 __add__%extend 버전을 작성하는 것입니다. 최소한의 예 :

%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) 
+0

내 파이썬 용어는 가장자리 주위에 약간 거친 - 나는 그것이 더 정확하고 파이썬 만드는 사람을 감사하겠습니다 특히 두 번째 단락에서. – Flexo

+0

감사합니다. 제대로 된 것 같지만 \ __ add__에 대한 서명은 모르고있었습니다. 이제는 매력처럼 작동합니다 : 'btVector3 __add __ (const btVector3 & rhs) { return :: operator + (* self, rhs); }' – tssch

관련 문제