SWIG和C++构造函数

SWIG and C++ constructors

本文关键字:构造函数 C++ SWIG      更新时间:2023-10-16

我想我一定遗漏了什么,希望有人能帮上忙。假设我有一个用以下构造函数声明的C++类:

class Value {
public:
  Value();
  Value(const char *val);
  void append(const Value &val);
private:
  ...
};

在创建了一个简单的SWIG接口文件后,类似于:

%module(naturalvar=1) Value
%{
#include "value.h"
%}
%include "value.h"

为Python创建包装器代码我可以这样做:

>>> import Value
>>> v1 = Value.Value()
>>> v2 = Value.Value("test")
>>> v1.append(v2)
>>> v1.append(Value.Value("test"))

但我不能这样做:

>>> v1.append("test")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/jakob/dev/test/Value.py in append(self, *args)
    298     def resize(self, *args): return _Value.Value_resize(self, *args)
    299     def isValidIndex(self, *args): return _Value.Value_isValidIndex(self, *args)
--> 300     def append(self, *args): return _Value.Value_append(self, *args)
    301     def get(self, *args): return _Value.Value_get(self, *args)
    302     def removeMember(self, *args): return _Value.Value_removeMember(self, *args)
TypeError: in method 'Value_append', argument 2 of type 'Value const &'

很明显,它知道如何使用Value(const-char*Value)构造函数,但我如何让它理解传递给append方法的字符串应该被馈送/转换为Value对象。

致以最良好的问候Jakob Simon Gaarde

Python不查看给定给函数的参数类型来确定要调用哪个函数(忽略方法调度)。所以我不认为你可以让python做你想做的事。另一方面,当意识到过载时,轻扫可以帮助你。如果您也重载append(),您可以得到您想要的。

class Value {
public:
  Value() { }
  Value(const char *val) { }
  void append(const Value &val) { }
  void append(const char *val) { }
};

可能还有另一个更整洁的解决方案,但这似乎对我有效。