簡體   English   中英

用相同的名稱增強python getter / setter

[英]Boost python getter/setter with the same name

我正在用boost-python包裝C ++類,我想知道有沒有比現在做的更好的方法了。

問題在於類具有相同名稱的getter / setter,並且似乎沒有一種輕松的方法將其與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上重新閱讀了該教程, 關於重載部分似乎很有前途。 不幸的是,這似乎並不是我想要的。

在重載部分,它提到了一個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一次,它將向python公開0參數和1參數的方法。

我希望這對於我的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
    ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM