3

の代わりに使用する場合、Pythonでクラス以下がどのように多形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の前に次の行が存在することを確認します。#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

Boost.Python には、boost::shared_ptr を認識する特別なマジックが組み込まれています。現在、std::shared_ptr を認識しません。今のところ、眉をひそめ、boost::shared_ptr を使用してください。

于 2012-04-17T14:02:41.683 に答える
0

あなたが書いたようstd::shared_ptrに使用して、boost::python IIRCで一度作業しました。get_pointer(関連するコメントはこちら)。class_<A,std::shared_ptr<A>,...>それがあなたの関数が引数として取るものなので、あなたが持つ必要があると思います。

于 2012-04-18T20:57:48.363 に答える