Неясно, как вы пришли к ошибке, которую вы показали.boost::tuple
сложно обернуть по умолчанию, и, кажется, нет никакого стандартного интерфейса к нему, включенного в SWIG.В моих тестах я не мог подобраться к ошибке, которую вы видели, без ручной записи файла интерфейса.
Однако мне удалось обернуть кортежи boost, используя следующий файл интерфейса:
%{
#include <boost/tuple/tuple.hpp>
%}
namespace boost {
template <typename T1=void, typename T2=void, typename T3=void>
struct tuple;
template <>
struct tuple<void,void,void> {
};
template <typename T1>
struct tuple<T1, void, void> {
tuple(T1);
%extend {
T1 first() const {
return boost::get<0>(*$self);
}
}
};
template <typename T1, typename T2>
struct tuple <T1, T2, void> {
tuple(T1,T2);
%extend {
T1 first() const {
return boost::get<0>(*$self);
}
T2 second() const {
return boost::get<1>(*$self);
}
}
};
template <typename T1, typename T2, typename T3>
struct tuple <T1,T2,T3> {
tuple(T1,T2,T3);
%extend {
T1 first() const {
return boost::get<0>(*$self);
}
T2 second() const {
return boost::get<1>(*$self);
}
T3 third() const {
return boost::get<2>(*$self);
}
}
};
}
В основном все, что он делает - это добавляет функции доступа к каждой из специализаций кортежа, которые могут вас заинтересовать.Достаточно сделать его минимально полезным на Java или другом языке.Вы хотели бы расширить это, чтобы охватить большие кортежи.Возможно, вы захотите заставить функции-члены получать / устанавливать, если ваши кортежи не предназначены для неизменности.
Я смог проверить это с помощью модуля SWIG:
%module test
%include "boost_tuple.i"
%template(TestTuple) boost::tuple<int, double, char>;
%template(SingleTuple) boost::tuple<char>;
%inline %{
boost::tuple<int, double, char> func1() {
return boost::make_tuple(3, 2.0, '1');
}
void test1(boost::tuple<int, double, char>) {
}
%}
, который сработалкак и ожидалось со следующей Java:
public class run {
public static void main(String[] argv) {
System.loadLibrary("test");
TestTuple t = test.func1();
System.out.println("1: " + t.first() + " 2: " + t.second() + " 3: " + t.third());
test.test1(test.func1());
test.test1(new TestTuple(0, 0.0, '0'));
}
}