我使用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<>创建?
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