gpt4 book ai didi

python - 使用相同的名称提升 python getter/setter

转载 作者:太空狗 更新时间:2023-10-29 21:09:25 26 4
gpt4 key购买 nike

我正在用 boost-python 包装 C++ 类,我想知道是否有比我现在做的更好的方法。

问题是这些类有同名的 getters/setters,似乎没有一种简单的方法可以用 boost-python 包装它。

这是问题的简化版本。给定这个类:

#include <boost/python.hpp>

using namespace boost::python;

class Foo {
public:
double
x() const
{
return _x;
}

void
x(const double new_x)
{
_x = new_x;
}

private:
double _x;
};

我想做这样的事情:

BOOST_PYTHON_MODULE(foo)
{
class_<Foo>("Foo", init<>())
.add_property("x", &Foo::x, &Foo::x)
;
}

这行不通,因为 boost-python 无法确定要使用哪个版本的函数。

事实上,你甚至做不到

.def("x", &Foo::x)

出于同样的原因。

我正在重新阅读 boost.org 上的教程和 section on overloading看起来很有前途。不幸的是,这似乎不是我要找的。

在重载部分,它提到了一个像这样工作的 BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS 宏:

如果 Foo 中有另一个成员函数接受默认参数:

void z(int i=42)
{
std::cout << i << "\n";
}

然后您可以使用宏:

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(z_member_overloads, z, 0, 1)

然后在 BOOST_PYTHON_MODULE 中:

.def("z", &Foo::z, z_member_overloads())

z_member_overloads 让您调用 def 一次,它会为 0 个参数和 1 个参数向 python 公开方法。

我希望这对我的 x()x(double val) getter/setter 有用,但它不起作用。

做:

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(x_member_overloads, x, 0, 1)
...
.def("x", &Foo::x, x_member_overloads())

不编译:

error: no matching member function for call to 'def'

.def("x", &Foo::x, x_member_overloads())
~^~~

问题:那么,是否有另一个宏或其他东西可以使这项工作正常进行?

为了完整起见,这就是我目前处理此类情况的方式:

    .add_property(
"x",
make_function(
[](Foo& foo) {
return foo.x();
},
default_call_policies(),
boost::mpl::vector<double, Foo&>()
),
make_function(
[](Foo& foo, const double val) {
foo.x(val);
},
default_call_policies(),
boost::mpl::vector<void, Foo&, double>()
)
)

最佳答案

您可以通过转换为适当的重载(未经测试)来做到这一点:

class_<Foo>("Foo", init<>())
.add_property("x",
static_cast< double(Foo::*)() const >(&Foo::x), // getter
static_cast< void(Foo::*)(const double) >(&Foo::x)) // setter
;

关于python - 使用相同的名称提升 python getter/setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com