设计建议:`unique_ptr`和pybind11

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

我有一个设置,其中资源

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
。我怎样才能规避这个问题?我看到了可能性:

  1. 用 pybind11 可以理解的内容替换
    std::unique_ptr
    。这意味着在 C++ 和 Python 方面,尽管
    R
    已经被其他一些
    F
    消耗,但
    R
    可以输入到
    F
    中。
    1. 不要服用
      std::unqique_ptr
      ,而是服用
      R*&
      。然后将参数设置为零即可体现所有权的转移。不过,看起来不太 C++。
  2. 围绕
    F
    编写不需要
    unique_ptr
    的包装。这也会有同样的问题,但仅限于 Python 端。也许我可以实施一些措施来解决这个问题。另外,我不需要更改现有代码的接口。缺点是,我需要复制我需要的所有方法。

这两种解决方案似乎都不太有吸引力。有什么替代方案吗?

c++ smart-pointers pybind11
1个回答
0
投票

语言互操作的问题之一是您必须遵守两种语言的数据模型。 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>)

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