消除非const和const访问方法的歧义(Pybind11)



我正在尝试使用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,但我认为Funcdef试图从第二个参数推断的类型。问题是,您无法获得指向重载集的函数指针。你只能得到一个指向单个函数的函数指针。

文档声明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中。不要忘记,指向成员函数的指针与指向自由函数的指针在本质上是不同的(它们需要调用一个对象)。

相关内容

  • 没有找到相关文章

最新更新