1

Python に正常にバインドされたFooを含むc++ 型があります。std::function<void()> funcs私の目的は、Python で関数を定義し、それらをこの型に追加してから、インスタンスを返すことです。C ++では、pybindを使用して、機能するこのタイプのインスタンスを取得します。ただし、関数の 1 つを呼び出そうとすると、プログラムのセグメント フォールトが発生します。

class Foo
{
    void addFunc(std::function<void()> _func)
    {
      funcs.push_back(_func);
    }

    void call(int _index)
    {
      funcs[_index]();
    }

private:
    std::vector<std::function<void()>> funcs;
}

namespace py = pybind11;

PYBIND11_MODULE(foo, m) 
{
    py::class_<Foo>(m, "foo")
        .def(py::init<int, int>())
        .def("addFunc", &Foo::addFunc)
        .def("call", &Foo::call);
}

そして後でC ++で

py::scoped_interpreter python;
auto module = py::module::import("foo_module");
auto func = module.attr("create_foo");
auto result = func();
//This works!
result.attr("call")(0);
Foo* blah = result.cast<Foo*>();
//This seg-faults!
blah->call(0);

私のpythonモジュールにはこれがあります:

def newFunc():
    print "working!"

def create_foo():

  temp = foo.Foo(0, 100)
  temp.addFunc(newFunc)
  return temp

関数が正しく c++ にキャストされない理由がわかりません。

4

1 に答える 1