gpt4 book ai didi

javaout typemap 不适用于 std::vector of pointers

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:04 24 4
gpt4 key购买 nike

使用 vector 结构一切正常

%include <std_vector.i>

%typemap(javaout) const S1& std::vector<S1>::get {
//custom code
}

struct S1 {};
std::vector<S1> val;

%template(vector_s1) std::vector<S1>;

但不适用于指针的vector

%include <std_vector.i>

%typemap(javaout) const S1*& std::vector<S1*>::get {
//custom code
}

struct S1 {};
std::vector<S1*> val;

%template(vector_s1) std::vector<S1*>;

示例是使用 swig -java -c++ -module sample sample.i

编译的

SWIG 版本:

$ swig -version

SWIG Version 3.0.7

Compiled with i586-mingw32msvc-g++ [i586-pc-mingw32msvc]

Configured options: +pcre

最佳答案

如果您查看文件 swig/Lib/std/std_vector.i std::vector 提供与语言无关的包装代码,您会发现以下评论:

// ***
// This specialization should disappear or get simplified when
// a 'const SWIGTYPE*&' can be defined
// ***
template<class _Tp, class _Alloc >
class vector<_Tp*, _Alloc > { ...

看来 SWIG 目前无法处理 const S1*&在您上面的类型映射定义中。

现在,文件 swig/Lib/java/std_vector.istd::vector 提供 java 包装器不那么复杂并且缺乏 std::vector<T*> 的特化.

自己添加这样的专业应该可以解决您的问题:

文件 std_vector_pointer.i :

%include <std_vector.i>
namespace std {
template<class T> class vector<T*> {
public:
typedef size_t size_type;
typedef T* value_type;
typedef value_type const_reference;
vector();
vector(size_type n);
size_type size() const;
size_type capacity() const;
void reserve(size_type n);
%rename(isEmpty) empty;
bool empty() const;
void clear();
%rename(add) push_back;
void push_back(T* x);
%extend {
T* get(int i) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
return (*self)[i];
else
throw std::out_of_range("vector index out of range");
}
void set(int i, T* val) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
(*self)[i] = val;
else
throw std::out_of_range("vector index out of range");
}
}
};
}

那么以下内容应该适用于您上面的示例:

%include "std_vector_pointer.i"

%typemap(javaout) S1* std::vector<S1*>::get {
//custom code
}

struct S1 {};
std::vector<S1*> val;

%template(vector_s1) std::vector<S1*>;

关于javaout typemap 不适用于 std::vector of pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33938455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com