【发布时间】:2012-04-28 16:28:00
【问题描述】:
我想知道下面的类A 和B 在使用std::shared_ptr 而不是boost::shared_ptr 时如何在python 中多态地工作?
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);
}
我知道必须为std::shared_ptr 定义boost::get_pointer 方法,因此我确保在#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 类型。
谢谢。
【问题讨论】:
-
如果其他人偶然发现了这一点,@eudoxos 有一个有效的解决方案,如下所示。你不需要切换到
boost::shared_ptr。
标签: c++ c++11 polymorphism shared-ptr boost-python