关于C++:更改Python swigged C函数的返回值类型

Change return value type of Python swigged C function

我有一个C++函数

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

其中version是一个类,包含"版本信息",例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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用户在调用getVersion()函数时会返回一个版本对象。

我想在从Python调用时更改getVersion()函数的行为。我不返回版本对象,而是返回一个表示版本值的字符串。

我尝试了以下方法:

1
2
3
4
5
6
7
8
9
%rename(getVersionHidden) getVersion;

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

但这并不能编译:

1
2
3
4
5
6
7
8
   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 *)

也许排版图的使用是一种方法。我是新来的,所以不确定……


%ReNEAM只为目标语言重命名函数——即,EDCOX1 OR 0将创建一个Python函数(GeVestOnLoad),它转发了C/C++中定义的GETVIEWORN()。

相反,您应该创建一个新的函数,然后将其重命名,以覆盖否则将自动生成的getversion:

1
2
3
4
5
6
7
8
9
%rename("getVersion") _getVersion_Swig;

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