Поймите, как правильно обернуть std::вектор

#c #swig

#c #глоток

Вопрос:

В некотором коде c , который мы хотим использовать с Java, используется вектор двойных указателей, например:

 typedef std::vectorlt;double *gt; VEC_pD;  

Я предположил, что будет достаточно обернуть его так:

 %include "typemaps.i" %include "cpointer.i" %include "stl.i"  %pointer_class(double, doublep); %template (VEC_pD) std::vectorlt;double*gt;; typedef std::vectorlt;double *gt; VEC_pD;  

While double * правильно завернут в doublep.java при обертывании вектора используется не удвоение, а скорее автогенерированный тип SWIGTYPE_p_double .

Я использую SWIG 4.0.2. Любые подсказки, как сообщить векторному шаблону, как использовать doublep, будут высоко оценены.

Комментарии:

1. Попробуй %template (VEC_pD) std::vectorlt;doublepgt;; . Недавно я завернул a vectorlt;vectorlt;Tgt;gt; и использовал завернутое имя для vectorlt;Tgt; во внешнем определении. Мое завернутое имя для vectorlt;Tgt; было также C typedef для того же самого; Я не знаю, имело ли это значение.

Ответ №1:

Thx Джон, действительно, переключение на doublep сгенерировало правильный класс java.

 %template (VEC_pD) std::vectorlt;doublepgt;;  

Комментарии:

1. Я поговорил с Суном. С учетом вышесказанного обертывание typedef std::vectorlt;double *gt; VEC_pD; само по себе использует удвоение. Однако все варианты использования в коде VEC_pD теперь переходят к SWIGTYPE_p_std__vectorT_double_p_t, поскольку исходный вектор указателей на удвоение больше не завернут.