Изменить тип возвращаемого значения функции Python Swigged C - PullRequest
0 голосов
/ 29 июня 2018

У меня есть функция C ++

Version getVersion(){ return Version("1.2.3.5");}

где Version - это класс, содержащий "информацию о версии", например,

class Version
{
    public:
                                                Version(const string& version = gEmptyString);
        bool                                    parse(const string& input);
        int                                     getMajor() const;
        int                                     getMinor() const;
        int                                     getPatch() const;
        int                                     getBuild() const;
        string                                  asString(const string& format = gEmptyString) const;


    private:
        int                                     mMajor;
        int                                     mMinor;
        int                                     mPatch;
        int                                     mBuild;
};

При переносе этого кода с помощью Swig пользователь Python получает объект Version при вызове функции getVersion ().

Я бы хотел изменить поведение функции getVersion () при вызове из Python. Вместо того, чтобы возвращать объект Version, я бы хотел вернуть строку, представляющую значение Version.

Я попробовал следующее:

%rename(getVersionHidden) getVersion;

%inline %{
std::string getVersion()
{
    Version v = getVersionHidden();
    return v.asString();
}
%}

но это не компилируется:

   Error ... Call to undefined function 'getVersionHidden' in function 
   getVersion()
   Error E2285 P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx 4434: Could not 
   find a match for 'Version::Version(const Version&)' in function getVersion()
   Error E2015 P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx 16893: Ambiguity 
   between 'dsl::getVersion() at P:/libs/dsl/Common\dslCommon.h:8' and 
   'getVersion() at P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx:4432' in 
   function _wrap_getVersionHidden(_object *,_object *)

Возможно, стоит использовать карту типов. Я новичок в Swig, так что не уверен ..?

1 Ответ

0 голосов
/ 30 июня 2018

% rename переименовывает только функцию для целевого языка, то есть %rename("getVersionHidden") getVersion; создаст функцию Python (getVersionHidden), которая перенаправляет getVersion (), определенную в C / C ++.

Вместо этого вы должны создать новую функцию и затем переименовать ее, чтобы переопределить getVersion, который в противном случае генерировался бы автоматически:

%rename("getVersion") _getVersion_Swig;

%inline %{
std::string _getVersion_Swig()
{
    Version v = getVersion();
    return v.asString();
}
%}
...