16

我正在尝试让 Boost Python 与 std::shared_ptr 很好地配合使用。目前,我收到此错误:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    comp.place_annotation(circle.centre())
TypeError: No to_python (by-value) converter found for C++ type: std::shared_ptr<cgl::Anchor>

通过调用 circle.centre(),它返回一个 std::shared_ptr。我可以将每个 std::shared_ptr 更改为 boost::shared_ptr (Boost Python 可以很好地使用它)但是要更改的代码量相当可观,我想使用标准库。

circle 方法声明如下:

const std::shared_ptr<Anchor> centre() const
{
    return Centre;
}

像这样的锚类:

class Anchor
{
    Point Where;
    Annotation* Parent;
public:

    Anchor(Annotation* parent) :
        Parent(parent)
    {
        // Do nothing.
    }

    void update(const Renderer& renderer)
    {
        if(Parent)
        {
            Parent->update(renderer);
        }
    }

    void set(Point point)
    {
        Where = point;
    }

    Point where() const
    {
        return Where;
    }
};

相关的 Boost Python 代码是:

class_<Circle, bases<Annotation> >("Circle", init<float>())
.def("radius", &Circle::radius)
    .def("set_radius",  &Circle::set_radius)
    .def("diameter", &Circle::diameter)
    .def("top_left", &Circle::top_left)
    .def("centre", &Circle::centre);

// The anchor base class.
class_<Anchor, boost::noncopyable>("Anchor", no_init)
    .def("where", &Anchor::where);

我正在使用 Boost 1.48.0。有任何想法吗?

4

4 回答 4

16

看起来 boost::python 不支持 C++ 11 std::shared_ptr。

如果您查看文件 boost/python/converter/shared_ptr_to_python.hpp ,您会发现 boost::shared_ptr 的模板函数 shared_ptr_to_python(shared_ptr<T> const& x) 的实现(它解释了为什么代码适用于 boost:: shared_ptr)。

我认为你有几个选择:

  • 使用 boost::shared_ptr (你试图避免)
  • 为 std::shared_ptr 编写 shared_ptr_to_python 的实现(恕我直言,最好的选择)
  • 向 boost::python 开发人员发送请求以支持 std::shared_ptr
于 2012-12-26T20:08:37.587 回答
6

除非我误解了,否则我认为这可以解决您的问题:

boost::python::register_ptr_to_python<std::shared_ptr<Anchor>>();

http://www.boost.org/doc/libs/1_57_0/libs/python/doc/v2/register_ptr_to_python.html

于 2014-12-11T13:14:27.543 回答
1

有一个错误报告: https ://svn.boost.org/trac/boost/ticket/6545

看起来有人正在研究它。

于 2013-05-31T22:33:31.450 回答
1

来自http://boost.2283326.n4.nabble.com/No-automatic-upcasting-with-std-shared-ptr-in-function-calls-td4573165.html的片段:

/* make boost::python understand std::shared_ptr */
namespace boost {
       template<typename T>
       T *get_pointer(std::shared_ptr<T> p)
       {
               return p.get();
       }
}

为我工作。您将定义您的类,如:

class_<foo, std::shared_ptr<foo>>("Foo", ...);

有了这个,其他返回的方法std::shared_ptr<foo>将正常工作。

虚函数/多态性可能需要一些魔法,这应该在我链接到的线程中进行介绍。

于 2014-10-26T11:41:13.410 回答