Я использую swig для создания оболочки для некоторых классов. Один класс принимает список QUuid (std :: list) (см. Ниже). Существует toString, который дает std :: string и python также может создавать экземпляр своего uuid, используя эту строку. Как я могу создать типовую карту (или, может быть, что-то еще лучше), которая использует преобразование, описанное выше, на python и наоборот. Лучше всего было бы, если бы это было независимо от целевого языка (по крайней мере, мне нужны рубиновые обертки).
благодаря
IRPICurrentPositionsCommand.h:
class IRPICurrentPositionsCommand : public CommandBase
{
Q_OBJECT
COMMAND_IMPLEMENTATION_BASICS(IRPICurrentPositionsCommand, ir)
public:
std::list<QUuid> GetAxisIDs() const
{
return m_AxisIDs;
}
void SetAxisIDs(std::list<QUuid> arg)
{
m_AxisIDs = arg;
}
std::list<double> GetAxisPostions() const
{
return m_AxisPostions;
}
void SetAxisPostions(std::list<double> arg)
{
m_AxisPostions = arg;
}
private:
std::list<QUuid> m_AxisIDs;
std::list<double> m_AxisPostions;
protected:
/** @see ora::CommandBase::Serialize(QDataStream &stream) **/
virtual void Serialize(QDataStream &stream) const;
/** @see ora::CommandBase::Deserialize(QDataStream &stream) **/
virtual void Deserialize(QDataStream &stream);
};
Вот шаблон SWIG/Python для объектов std::list<QUuid>
. Я не знаком с Ruby, но, надеюсь, это даст вам некоторое представление о типах.
// To use std::string
%include "std_string.i"
%typemap(out) std::list<QUuid>
{
PyObject* outList = PyList_New(0);
int error;
std::list<QUuid>::iterator it;
for ( it=$1.begin() ; it != $1.end(); it++ )
{
PyObject* pyQUuid = SWIG_NewPointerObj(new QUuid(*it), SWIGTYPE_p_QUuid, SWIG_POINTER_OWN );
error = PyList_Append(outList, pyQUuid);
Py_DECREF(pyQUuid);
if (error) SWIG_fail;
}
$result = outList;
}
%typemap(in) std::list<QUuid>
{
//$input is the PyObject
//$1 is the parameter
if (PyList_Check($input))
{
std::list<QUuid> listTemp;
for(int i = 0; i<PyList_Size($input); i++)
{
PyObject* pyListItem = PyList_GetItem($input, i);
QUuid* arg2 = (QUuid *) 0 ;
int res1 = 0;
void *argp1;
res1 = SWIG_ConvertPtr(pyListItem, &argp1, SWIGTYPE_p_QUuid, 0 | 0);
if (!SWIG_IsOK(res1))
{
PyErr_SetString(PyExc_TypeError,"List must only contain QUuid objects");
return NULL;
}
if (!argp1)
{
PyErr_SetString(PyExc_TypeError,"Invalid null reference for object QUuid");
return NULL;
}
arg2 = reinterpret_cast< QUuid * >(argp1);
listTemp.push_back(*arg2);
}
$1 = listTemp;
}
else
{
PyErr_SetString(PyExc_TypeError,"Wrong argument type, list expected");
return NULL;
}
}