Как использовать оператор C ++ [] в Cython?

Мне нужно обернуть класс FooContainer C ++, определяющий оператор []:

//foo.h:
#include <vector>
using namespace std;

struct Foo
{
Foo()
: value(42) {};
int value;
};class FooContainer
{
public:
FooContainer() { this->values = vector<Foo> (100) ;}
Foo operator[](int i) {return values[i];}; // <-- the function I need to call

private:
vector<Foo> values;

};

Я пытаюсь написать соответствующий файл .pyx, но что бы я ни пытался, я не могу понять, как использовать Foo :: operator

from cython.operator cimport dereference as derefcdef extern from "foo.h":
cdef cppclass CppFoo "Foo":
pass

cdef extern from "foo.h":
cdef cppclass CppFooContainer "FooContainer":
FooContainer()
Foo operator[](int)cdef class Foo:
cdef CppFoo * thisptr

cdef class FooContainer:
cdef CppFooContainer* thisptr

def __cinit__(self):
self.thisptr = new CppFooContainer ()

def __dealloc__(self):
if self.thisptr:
del self.thisptr
self.thisptr = <CppFooContainer*> 0

def __getitem__(self, int i):
cdef CppFoo f  = deref(self.thisptr)[i]  #just one out of many try

Возможно, мне не хватает тривиального решения, но я всегда получаю сообщение об ошибке: «Не удается преобразовать объект Python в« CppFoo »». Как правильно использовать оператор []?

2

Решение

Использование operator[] правильно (Cython не требует специального синтаксиса для оператора индексации массива), но

cdef extern from "foo.h":
cdef cppclass CppFooContainer "FooContainer":
FooContainer()
Foo operator[](int)

должно быть:

cdef extern from "foo.h":
cdef cppclass CppFooContainer "FooContainer":
CppFooContainer()
CppFoo operator[](int)

поскольку FooContainer а также Foo ссылаются на типы классов расширения Python, объявленные впоследствии, а не на типы классов C ++ из «foo.h».

1

Другие решения

Других решений пока нет …