自動生成された (Pyste を使用した) boost::python コードの何が問題なのかを理解しようとしていますが、これまでのところ運がありません。
2 つのクラスを提供する C++ ライブラリ、Magick++ がありMagick::Drawable
ますMagick::DrawableRectangle
。
https://www.imagemagick.org/subversion/ImageMagick/trunk/Magick++/lib/Magick++/Drawable.h
class MagickDLLDecl DrawableBase:
public std::unary_function<MagickCore::DrawingWand,void>
{...}
class MagickDLLDecl Drawable
{
public:
// Constructor
Drawable ( void );
// Construct from DrawableBase
Drawable ( const DrawableBase& original_ );
...
}
class MagickDLLDecl DrawableRectangle : public DrawableBase
{ ... }
これらは次の引数として使用されますImage.draw()
:
https://www.imagemagick.org/subversion/ImageMagick/trunk/Magick++/lib/Magick++/Image.h
// Draw on image using a single drawable
void draw ( const Drawable &drawable_ );
// Draw on image using a drawable list
void draw ( const std::list<Magick::Drawable> &drawable_ );
私はそれ用のpythonバインディングを作成しようとしています.すべてのクラスに自動生成されたラッパーがあります.
http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_Drawable.cpp
http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_DrawableRectangle.cpp
http://bitbucket.org/dan.kluev/pythonmagick/src/65d45c998ef3/src/_Image.cpp
問題は、DrawableBase から Drawable への間接的なクラス キャストが原因で、これらのラッパーが機能しないことです。
>>> import PythonMagick
>>> image = PythonMagick.Image()
>>> square = PythonMagick._PythonMagick.DrawableRectangle(0,0,200,200)
>>> image.draw(square)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
Image.draw(Image, DrawableRectangle)
did not match C++ signature:
draw(Magick::Image {lvalue}, std::list<Magick::Drawable, std::allocator<Magick::Drawable> >)
draw(Magick::Image {lvalue}, Magick::Drawable)
# But abstract Drawable() does work:
>>> image.draw(PythonMagick._PythonMagick.Drawable())
>>>
PyObject を Drawable にキャストする C++ で独自の draw() ラッパーを記述するよりも、これを処理するためのより良い方法はありますか?