SWIG 如何正确包装 std::vector<double *>

Posted

技术标签:

【中文标题】SWIG 如何正确包装 std::vector<double *>【英文标题】:SWIG How to correctly wrap std::vector<double *> 【发布时间】:2021-12-06 13:32:12 【问题描述】:

我们想在 Java 中使用的一些 c++ 代码使用双指针向量,如下所示:

typedef std::vector<double *> VEC_pD;

我认为这样包装就足够了:

%include "typemaps.i"
%include "cpointer.i"
%include "stl.i"

%pointer_class(double, doublep);
%template (VEC_pD) std::vector<double*>;
typedef std::vector<double *> VEC_pD;

虽然 double * 被正确包装到 doublep.java 中,但向量的包装不使用 douplep,而是使用自动生成的类型 SWIGTYPE_p_double

我正在使用 SWIG 4.0.2。非常感谢任何提示如何告诉矢量模板如何使用 doublep。

【问题讨论】:

试试%template (VEC_pD) std::vector&lt;doublep&gt;;。我最近包装了一个vector&lt;vector&lt;T&gt;&gt;,并在外部定义中使用了vector&lt;T&gt; 的包装名称。我对vector&lt;T&gt; 的包装名称也是相同的C++ typedef;我不知道这是否重要。 【参考方案1】:

谢谢 John,确实切换到 doublep 生成了正确的 java 类。

%template (VEC_pD) std::vector<doublep>;

【讨论】:

我很快就谈过了。有了上面 typedef std::vector VEC_pD; 的包装本身使用双倍。但是,VEC_pD 代码中的所有使用现在都转到 SWIGTYPE_p_std__vectorT_double_p_t,因为不再包装双指针的原始向量。

以上是关于SWIG 如何正确包装 std::vector<double *>的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 列表在 C++ 中使用 SWIG 分配 std::vector?

在 swig 上包装返回向量<T>

如何在 SWIG 中为 c++ 创建模板函数?

[swig-JavaScript] 是不是支持 std::vector<std::string>* 作为输出?

我有一个 SWIG 包装的向量。我怎么知道它包含哪种类型?

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数