に関して言えばboost::shared_ptr
、Boost.Pythonは一般的に必要な機能を提供します。この特定のケースでは、モジュール宣言がによって保持されるものを定義し、Boost.Pythonがから継承するように指示さto_python
れている限り、カスタムコンバーターを明示的に提供する必要はありません。Base
boost::shared_ptr<Base>
A
Base
BOOST_PYTHON_MODULE(example) {
using namespace boost::python;
class_<Base, boost::shared_ptr<Base>,
boost::noncopyable>("Base", no_init);
class_<A, bases<Base>,
boost::noncopyable>("A", no_init);
def("factory", &factory);
def("consumer", &consumer);
}
Boost.Pythonは、コアライブラリへの変更が必要なため、現在カスタム左辺値コンバーターをサポートしていません。したがって、関数はby値またはconst-referenceconsumer
のいずれかを受け入れる必要があります。boost:shared_ptr<A>
次のいずれかの署名が機能するはずです。
void consumer(boost::shared_ptr<A> a)
void consumer(const boost::shared_ptr<A>& a)
完全な例を次に示します。
#include <boost/python.hpp>
#include <boost/make_shared.hpp>
class Base
{
public:
virtual ~Base() {}
};
class A
: public Base
{
public:
A(int value) : value_(value) {}
int value() { return value_; };
private:
int value_;
};
boost::shared_ptr<Base> factory()
{
return boost::make_shared<A>(42);
}
void consumer(const boost::shared_ptr<A>& a)
{
std::cout << "The value of object is " << a->value() << std::endl;
}
BOOST_PYTHON_MODULE(example) {
using namespace boost::python;
class_<Base, boost::shared_ptr<Base>,
boost::noncopyable>("Base", no_init);
class_<A, bases<Base>,
boost::noncopyable>("A", no_init);
def("factory", &factory);
def("consumer", &consumer);
}
そして使用法:
>>> from example import *
>>> x = factory()
>>> type(x)
<class 'example.A'>
>>> consumer(x)
The value of object is 42
>>>
Base
の基本クラスであるモジュール宣言が指定されているためA
、Boost.Pythonはから返された型を解決できましfactory()
たexample.A
。