Pybind11:init<>与lambda

问题描述 投票:1回答:1

我使用pybind11作为我的C++代码的封装器,将其放入python库中。

碰巧有一些参数我无法提供,或者有时我想做一个我在C++中知道的转换初始化。比如说,可能是因为python中不知道这个类。如何才能做到这一点呢?目前我看到的唯一的 "解决办法 "就是在C++中创建一个继承的代理类。

举个例子,我想在C++中定义一个python的代理类。我想定义一个Python的A类

class A:
  def __init__(self, B b):
    ...

与一个C++的等价类进行绑定

class A {
  A(C c, D d);
}

有没有一些lambda或等价的东西可以让我为pybind11::init<>创建?

python c++ pybind11
1个回答
1
投票

pybind11可以让你将工厂函数绑定为init方法。因此,你必须在c++中提供一个函数,接受一个B并返回一个A,然后你可以将其绑定为A的初始化方法。

pybind11文档中的一个例子。

class Example {
private:
    Example(int); // private constructor
public:
    // Factory function:
    static Example create(int a) { return Example(a); }
};

py::class_<Example>(m, "Example")
    .def(py::init(&Example::create));

如果你不想(或者不能)改变c++中的A类,你应该也可以用一个自由函数来绑定(而不仅仅是一个静态函数)。

所以它可以像这样(改成返回一个unique_ptr,pybind可以直接拥有它,而不是一个原始实例。但是这两种方法都可以用)

std::unique_ptr<A> createA(const B& arg)
{
  // returns an instance of A that you made using B
}

py::class_<A>(m, "A")
    .def(py::init(&createA));

显然,你还需要在python中为B提供一个绑定。

文档在这里,包含了更多的例子,包括如何做一个init lambda。https:/pybind11.readthedocs.ioenstableadvancedclasses.html#custom-structors

© www.soinside.com 2019 - 2024. All rights reserved.