代码之家  ›  专栏  ›  技术社区  ›  Tristram Gräbener

指向swig(或boost::python)中成员的指针

  •  1
  • Tristram Gräbener  · 技术社区  · 16 年前

    我从我的C++应用程序中为python做了一些绑定。

    问题是我使用指向成员的指针(它用于计算最短路径,并将属性作为参数最小化)。

    这是C++签名:

    std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*)
    

    这就是我所做的(根据我在医生中的理解):

    %constant float Edge::* distance = &Edge::distance;
    

    这是我从python调用函数的方式:

    foo.martins(0, 1000, g, foo.distance)
    

    这就是我得到的错误:

    NotImplementedError: Wrong number of arguments for overloaded function 'martins'.
    Possible C/C++ prototypes are:
    martins(int,int,MultimodalGraph &,float Edge::*)
    

    我有一个重载方法,它使用了默认的第四个参数,并且工作得很好。

    那么是否可以使用指向带有swig的成员的指针?如果是,技巧是什么?如果没有,最优雅的工作方式是什么?

    谢谢你的帮助!

    更新: 如果有人知道Boost::python是否确实做到了,我将切换到它。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Bruno Oliveira    16 年前

    不知道Swig,但是在Boost::python中,您可以编写一个包装器:

    bool foo(int x, float* result);
    
    boost::python::tuple foo_wrapper(int x)
    {
        float v;
        bool result = foo(x, &v);
        return boost::python::make_tuple(result, v);
    }
    
    BOOST_PYTHON_MODULE(foomodule)
    {
        def("foo", &foo_wrapper);
    }
    

    在python中,您可以:

    result, v = foomodule.foo(x)
    

    因为在python中,浮点数是不可变的,所以实际上不能将一个浮点数传递给一个方法并期望该方法更改浮点数,所以我们调整代码以返回一个值的元组。

    推荐文章