pybind11 通过引用访问私有类成员

问题描述

我得到了一个带有私有变量 locked_ 的类。可以通过方法 bool& locked();bool locked() const;

访问此变量
class Test {
    
  bool& locked();
  bool locked() const;
    
 private:
  bool locked_{true};
};

我不允许更改类 Test,但我必须编写一个允许设置和检索 locked_ 的 pybind11 接口。

我不能使用 .def_readwrite("locked",&Test::locked_);,因为 locked_ 当然是私有的。 我尝试使用

.def("locked",static_cast<bool& (Test::*)()>(&Test::locked),"locked",py::return_value_policy::reference_internal);

编译不过只是返回一个 bool 而不是对 bool 的某种可修改的引用。

如何在不“触及”原始 C++ 实现的情况下使锁定的读/写可访问。

解决方法

我仍然不知道 pybind,但我开始从你的问题中学习,我记得 def 接受 lambdas。您可以像这样包装对成员的调用:

auto locker = [](Test& t,bool lock) { t.locked() = lock; };

我不确定您是否需要做一些额外的事情来使 def 与您的自定义 Test 一起工作,所以我想它可以这样使用:

m.def("locker",locker);