Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Cython] Wrapper C++

1 réponse
Avatar
Kaoron
Bonjour,

J'essaye de créer une wrapper pour une API C++ grâce à Cython, et j'ai
un petit problème de design. Actuellement, le code ressemble à ceci :

###########################################################
### spam.hpp (C++)
# class Spam
# {
# int a,b;
#
# Spam (int a, int b);
# ~Spam();
# bool isOK();
#
# static Spam getSpam();
# }
###

cdef extern from "spam.hpp":
ctypedef struct c_Spam "Spam":
int a,b
bool isOK()
c_Spam *newSpam "new Spam" (int a, int b)
void del_Spam "delete" ()
c_Spam c_getSpam "getSpam" ()

cdef class Spam:
# Static methods
@staticmethod
def getSpam(cls):
cdef Spam s
s = Spam()

s.setthis(c_getSpam())
return s

cdef c_Spam *this
# Instance Methods

# XXX : ugly workaround
cdef setthis(self, Spam ptr):
del_Spam(self.this)
self.this = &mode

def __cinit__(self, int a, int b):
self.this = new_Spam(a,b)

def __dealloc__(self):
del_Spam(self.this)

def isOK(self):
return self.this.isOK()

#Properties
property a :
def __get__(self): return self.this.a
def __set__(self, a): self.this.a = a
###########################################################

Mon problème se trouve au niveau de la méthode statique : c'est une
factory (en C++), donc elle me retourne une instance.
Pour créer le wrapper, j'ai un petit workaround qui consiste à créer une
instance, supprimer l'objet C++ alloué et le remplacer par l'instance
retournée : c'est la méthode setthis (c'est une méthode cdef, elle n'est
pas accessible depuis python).

Je trouve ça particulièrement malfichu, mais je n'ai pas su faire mieux.

Que feriez-vous dans un tel cas ?

Kaoron.

1 réponse

Avatar
Olivier Ravard
>
Que feriez-vous dans un tel cas ?



j'utiliserai boost.python.

Olivier