SWIG를 사용하여 PERL에서 C ++ 프로그램의 목록 템플릿에 액세스하려면 어떻게해야합니까?
문제
PERL 스크립트에서 C ++ 프로그램의 템플릿 목록에 액세스하고 해당 값을 사용하고 싶습니다.
예제 코드 :
typedef list < Struct1 * > sturct1_list;
struct Struct2
{
int i;
struct1_list List1;
}
struct Struct1
{
int j;
}
하나의 SWIG 생성 API를 사용했고 다음을 수행했습니다.
$myList = Struct2_struct1List_get
print "Reference type: " . ref($myList) ;
이제이 인쇄물은 다음과 같이 인쇄합니다.
Reference type: \_p\_std\_\_listTutils\_\_Struct1\_p\_t
이것을 사용하여 구조에서 값을 얻는 방법은 무엇입니까?
중복 질문에서 업데이트 :
내가 넣은 인터페이스 파일에서
%template(ListStruct1) std::list< Struct1 * >;
".pm"파일을 생성 한 후. 이 목록을 사용할 수있는 API를 확인했습니다.
나는 찾았다
ListStuct1_size
ListStuct1_empty
ListStuct1_clear
ListStuct1_push.
나는 그 요소를 사용할 수있었습니다. 그러나이 API를 사용하여 목록의 개별 요소에 액세스하는 방법을 모르겠습니다. 아니면 인터페이스 파일에 뭔가 누락 되었습니까?
업데이트 :
TypEMap이 여기에서 배열로 목록을 반환 할 수 있습니까 ??
해결책
우선, 일반 정보
이 튜토리얼 템플릿 래퍼를 수행하는 방법을 보여줍니다.
동일한 자습서는 Perl에서 모듈을 사용하는 방법을 보여 주지만 Perl 예제는 템플릿을 터치하지 않습니다.
이 기사 벡터로 수행하는 방법을 보여줍니다
다음은 일반적인 SWIG STL 문서입니다 언급 한 것 같습니다 std_list.i 상호 작용.
둘째, 목록에 대해
첨자로 Perl 배열처럼 C ++ 목록을 "액세스"할 수 없습니다. 원한다면 벡터를 기본 유형으로 사용해야합니다.
대안으로 클래스 확장 목록을 작성하고 인덱스별로 요소를 반환하는 새로운 메소드를 제공하고 해당 메소드를 인터페이스에 노출시킵니다.
C ++에서와 같이 요소를 찾아 목록에 액세스하려면 find () 메소드를 노출시키는 목록 인터페이스를 작성해야합니다. 기본값은 소스 코드를 읽지 않습니다.
다른 팁
인터페이스에서 시도해보십시오.
%include "std_list.i"
%template(ListStruct1) std::list< Struct1 * >;
STD 라이브러리는 좀 재미 있고 Swig가 랩을 할 수있는 목록이라는 실제 바이너리 객체가 없습니다. 모든 템플릿이므로 SWIG는 무슨 일이 일어나고 있는지 알아 내기 위해 추가 도움이 필요합니다.
삽입, 제거 및 기타 목록 특정 기능을 래퍼에 추가해야합니다.
위의 작동이 작동하지 않으면 다음을 추가하십시오.
%define SWIG_EXPORT_ITERATOR_METHODS
업데이트 : 물론, 나는 이것이 Python, Java 및 몇몇 다른 사람들에게는 훌륭하지만 Perl에서 완전히 깨 졌다고 언급하지 않았다.