我正在尝试使用Pybind11包装一些c++类。类(Alpha)有两个getter,一个返回对成员force_
的const引用,另一个返回非const引用。
struct Dummy {
double x{3.3};
};
class Alpha {
const Dummy& force() const {return force_;}
Dummy& force() {return force_;}
private:
Dummy force_;
};
我最初尝试使用py::return_value_policy
,但这种方式,似乎我没有正确地消除函数force()
的两个版本之间的歧义,因为我得到note: template argument deduction/substitution failed:
和couldn’t deduce template parameter ‘Func’
py::class_<Alpha>(m, "Alpha")
.def(py::init())
.def("force", &Alpha::force, "returns reference", py::return_value_policy::reference_internal)
.def("force", &Alpha::force, "returns copy", py::return_value_policy::copy);
}
我走错方向了吗?我真的不想改变代码的c++部分。一个附带的问题是:我怎样才能明确地写&Alpha::force
来表示const或非const版本。
我不知道pybind,但我认为Func
是def
试图从第二个参数推断的类型。问题是,您无法获得指向重载集的函数指针。你只能得到一个指向单个函数的函数指针。
文档声明Func可以是普通的c++函数、函数指针或lambda函数
好的,但它不能是一组重载!
这就是为什么与你的类(我不得不使force
公开!),这将不工作出于同样的原因:
int main() {
auto x = &Alpha::force;
}
结果错误是:
<source>:15:10: error: variable 'x' with type 'auto' has incompatible initializer of type '<overloaded function type>'
auto x = &Alpha::force;
^ ~~~~~~~~~~~~~
没有办法单独从&Alpha::force
中推断出类型。
您可以通过static_cast
:
auto x = static_cast< const Dummy& (Alpha::*)() const>(&Alpha::force);
与非const类似:
auto y = static_cast< Dummy& (Alpha::*)()>(&Alpha::force);
PS:你在文档中的报价实际上没有提到成员函数。我想这是由于报价不完整所致。如果def
不能接受成员函数指针,则必须将force
设置为静态,或者将调用封装在自由函数/lambda中。不要忘记,指向成员函数的指针与指向自由函数的指针在本质上是不同的(它们需要调用一个对象)。