Boost :: Python привязки для классов с наследованием - PullRequest
1 голос
/ 02 декабря 2010

Я пытаюсь понять, что не так с каким-то автоматически сгенерированным (с Pyste) кодом boost :: python, но пока что безуспешно.

Существует библиотека 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())
>>> 

Есть ли лучший способ справиться с этим, чем написать мою собственную обертку draw () в C ++, которая бы приводила PyObject в Drawable?

1 Ответ

1 голос
/ 02 декабря 2010

Если вы хотите, чтобы BP неявно преобразовывал объекты для вас, вы должны сказать BP, что они неявно конвертируемы.поместите что-то подобное в ваш bp :: code:

boost::python::implicitly_convertible<SourceType,DestType>();

Я не знаю, как заставить Pyste сделать это.

...