Как вызвать метод python, который возвращает очередь из C++, используя boost (ошибка типа non-sclar)?

У меня есть метод в python, который реализован следующим образом:

class MyClass:
    def __init__(self, i, j, k):
        self._i = i
        self._j = j
        self._k = k
    def generate_queue(self, max, min):
        # do stuff
        return queue_with_ints
class Class2:
    def __init__(self, mc):
        # mc is a MyClass object
        self._mc = mc

код C++ (я использовал список, потому что я не нашел никакой документации о boost::python::queue, и я всегда могу заставить функцию python возвращать список вместо этого, поскольку это не имело бы большого значения):

class Foo : public Node{
    // constructor
    // other functions
    void do_stuff_with_queue( int max, int min){
        // o is an instance of Class2
        boost::python::object mc = (this->o).attr("_mc");
        boost::python::list q = mc.attr("generate_queue")(max, min);
        int length = extract<int>(q.attr("__len__")());
        for (int i = 0; i < length; i++){
            int subframe = boost::python::extract<int>(q[i]);
            // do stuff
        }
}

вывод ошибки:

erreur: conversion from ‘boost::python::detail::dependent<boost::python::api::object, int>::type {aka boost::python::api::object}’ to non-scalar type ‘boost::python::list’ requested

Я не уверен, что здесь происходит, единственная другая ошибка нескалярного типа, которую я видел, - это когда кто-то пытался назначить указатель на объект из это сообщение. Как я могу это исправить?

Спасибо


person qwerty_99    schedule 08.07.2020    source источник
comment
Здесь нет boost::python::queue, так как Queue — это не встроенный, а обычный класс Python. Просто сохраните его в boost::python::object и используйте attr точно так же, как и с экземпляром MyClass.   -  person Dan Mašek    schedule 09.07.2020
comment
Вместо этого я использовал список, это сработает? Он компилируется, но его еще предстоит протестировать (я преобразую очередь python в список, прежде чем передавать его на С++) boost::python::list q = boost::python::extract<boost::python::list>(mc.attr("generate_queue")(max, min)); Изменить: формат   -  person qwerty_99    schedule 09.07.2020