SWIG를 사용하여 PERL에서 C ++ 프로그램의 목록 템플릿에 액세스하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1443576

  •  22-07-2019
  •  | 
  •  

문제

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 상호 작용.

둘째, 목록에 대해

  1. 첨자로 Perl 배열처럼 C ++ 목록을 "액세스"할 수 없습니다. 원한다면 벡터를 기본 유형으로 사용해야합니다.

  2. 대안으로 클래스 확장 목록을 작성하고 인덱스별로 요소를 반환하는 새로운 메소드를 제공하고 해당 메소드를 인터페이스에 노출시킵니다.

  3. C ++에서와 같이 요소를 찾아 목록에 액세스하려면 find () 메소드를 노출시키는 목록 인터페이스를 작성해야합니다. 기본값은 소스 코드를 읽지 않습니다.

다른 팁

인터페이스에서 시도해보십시오.

%include "std_list.i"

%template(ListStruct1) std::list< Struct1 * >;

STD 라이브러리는 좀 재미 있고 Swig가 랩을 할 수있는 목록이라는 실제 바이너리 객체가 없습니다. 모든 템플릿이므로 SWIG는 무슨 일이 일어나고 있는지 알아 내기 위해 추가 도움이 필요합니다.

삽입, 제거 및 기타 목록 특정 기능을 래퍼에 추가해야합니다.

위의 작동이 작동하지 않으면 다음을 추가하십시오.

%define SWIG_EXPORT_ITERATOR_METHODS 

업데이트 : 물론, 나는 이것이 Python, Java 및 몇몇 다른 사람들에게는 훌륭하지만 Perl에서 완전히 깨 졌다고 언급하지 않았다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top