Как построить обертку Cython для функции C ++ с параметром списка stl
Рассмотрим следующий простой код на C ++. (Printlist.h)
#ifndef TESTLIB_H
#define TESTLIB_H
#include <iostream>
#include <list>
void printlist(std::list<int> &);
#endif
(Printlist.c)
#include "printlist.h"
using namespace std;
void printlist(list<int> &l)
{
for(list<int>::const_iterator i = l.begin(); i != l.end(); i++)
cout << *i << ' ';
cout << endl;
}
Мой вопрос заключается в том, как использовать этот код с Cython, сложность заключается в том, что printlist принимает stl :: list. Есть ли способ объявить это, используя "extern"? Если нет, то как проще всего использовать эту функцию?
Это моя попытка:(Test.pyx)
from libcpp.list cimport list
cdef extern from "printlist.h":
void printlist(std::list<int> &)
cdef list[int] l = range(10)
printlist(l)
(Setup.py)
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test", ["test.pyx", "printlist.C"], language='c++',)]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)
Я получаю следующее сообщение об ошибке:
Error compiling Cython file:
------------------------------------------------------------
...
from libcpp.list cimport list
cdef extern from "printlist.h":
void printlist(std::list<int> &)
^
------------------------------------------------------------
test.pyx:4:27: Expected an identifier or literal