3

我想知道当使用A而不是?Bstd::shared_ptrboost::shared_ptr

struct A
{
    virtual ~A() {}
};

struct B : A
{
    B() {}
    virtual ~B() {}
};

void f(const std::shared_ptr<A>& ptr)
{}

BOOST_PYTHON_MODULE(test)
{
    class_<A, boost::noncopyable>("A", no_init);

    class_<B, std::shared_ptr<B>, bases<A>>("B")
        .def(init<>());

    def("f", f);
}

我知道boost::get_pointer必须为 定义该方法std::shared_ptr,因此我确保在 a 之前存在以下行#include <boost/python.hpp>

namespace boost {
template<class T> const T* get_pointer(const std::shared_ptr<T>& p)
{
    return p.get();
}

template<class T> T* get_pointer(std::shared_ptr<T>& p)
{
    return p.get();
}
} // namespace boost

现在,在python中我尝试:

>>> from test import *
>>> b = B()
>>> f(b)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ArgumentError: Python argument types in
    test.f(B)
did not match C++ signature:
    f(std::shared_ptr<A>)

注意:上面的代码适用于boost::shared_ptr,但我想坚持使用 C++11 类型。

谢谢。

4

2 回答 2

0

我曾经std::shared_ptr使用 boost::python IIRC,get_pointer在你写的时候使用。(相关评论在这里)。我的猜测是你需要有,class_<A,std::shared_ptr<A>,...>因为这是你的函数作为参数的。

于 2012-04-18T20:57:48.363 回答
0

Boost.Python 内置了特殊的魔法来识别 boost::shared_ptr。它目前无法识别 std::shared_ptr。现在,只需皱眉并使用 boost::shared_ptr。

于 2012-04-17T14:02:41.683 回答