我有一个设置,其中资源
R
可以通过也源自F
的各种过滤器R
。共享 R
的所有权是没有意义的,因为资源在检索时就会被消耗。有些我决定使用 unique_ptr
如下:
struct R{
virtual int yield() = 0;
};
struct F{
F(std::unique_ptr<R> r): _r(std::move(r)) {}
int yield(){return _r->yield() + 1;}
std::unique_ptr<R> _r;
};
当然,课程更有趣。现在我尝试将其与 pybind11 绑定。正如文档中所述,Pybind 似乎不喜欢
unique_ptr
。我怎样才能规避这个问题?我看到了可能性:
std::unique_ptr
。这意味着在 C++ 和 Python 方面,尽管 R
已经被其他一些 F
消耗,但 R
可以输入到 F
中。
std::unqique_ptr
,而是服用 R*&
。然后将参数设置为零即可体现所有权的转移。不过,看起来不太 C++。F
编写不需要 unique_ptr
的包装。这也会有同样的问题,但仅限于 Python 端。也许我可以实施一些措施来解决这个问题。另外,我不需要更改现有代码的接口。缺点是,我需要复制我需要的所有方法。这两种解决方案似乎都不太有吸引力。有什么替代方案吗?
语言互操作的问题之一是您必须遵守两种语言的数据模型。 Python 没有资源唯一所有权的概念,这就是为什么 pybind 不允许您将
std::unique_ptr
作为暴露给 Python 的参数。
我认为最简单的方法是使用
std::shared_ptr
,但请注意这仅适用于与 Python 绑定的互操作。对于 C++ 端,您仍然可以使用 F::F(std::unique_ptr<R> r)
,因为有一个转换构造函数 std::shared_ptr<R>::shared_ptr(std::unique_ptr<R>)
。