使用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
答案 0 :(得分:2)
如果你查看std::vector
文件swig/Lib/std/std_vector.i
,它为// ***
// This specialization should disappear or get simplified when
// a 'const SWIGTYPE*&' can be defined
// ***
template<class _Tp, class _Alloc >
class vector<_Tp*, _Alloc > { ...
提供了与语言无关的包装代码,你会发现以下评论:
const S1*&
因此,SWIG目前无法处理上述类型地图定义中的std::vector
。
现在,为std::vector<T*>
提供java包装器的文件swig/Lib/java/std_vector.i要复杂得多,而且缺少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*>;
然后以下内容适用于您的上述示例:
config.h
答案 1 :(得分:0)
为什么不使用std :: shared_ptr而不是使用原始指针?
此代码应按您期望的方式工作,使用您的自定义代码&#34;替换vector_s1.java中的get函数块。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
options = webdriver.ChromeOptions()
prefs = {"download.default_directory": r"C:\New_Download"}
options.add_experimental_option("prefs", prefs)
print(options.experimental_options)
chromeDriverPath = r'C:\drivers\chromedriver.exe'
driver = webdriver.Chrome(chromeDriverPath,chrome_options=options)
driver.get("http://google.com")
driver.set_window_position(0, 0)
driver.set_window_size(0, 0)