나는 SWIG가있는 프로젝트에서 파이썬 코드를 생성했습니다. 나는 이 std::string
에서 Message
이고 say(Message)
기능이 있습니다. 파이썬에서 문자열로 say
을 호출 할 수 있습니다. Message
유형의 변수를 만들 수 있고 싶고 Message
유형을 파이썬 래퍼가 아닌 라이브러리로 내보내고 싶습니다. 여기 내 파일은 다음과 같습니다SWIG에서 typedefd 유형의 변수 만들기
test.h
#include <string>
#include <iostream>
typedef std::string Message
void say(Message s);
Test.cpp에
#include "test.h"
void say(Message s)
{
std::cout << s << std::endl;
}
테스트 테스트
%module test
%{
#include "test.h"
%}
typedef std::string Message;
%include "std_string.i"
%include "test.h"
파이썬 예를
import test
test.say('a')
# >>> a
# What I want to be able to do
msg = test.Message('a')
# >>> Traceback (most recent call last):
# >>> File "<stdin>", line 1, in <module>
# >>> AttributeError: module 'test' has no attribute 'Message'
내 실제 사용 사례에는 다른 유형 (주로 열거 형)에 대한 typedef가 포함되어 있습니다. 이러한 경우에는 다른 처리 방법이 필요한지 궁금합니다. SWIG 바인딩 클래스의 객체를 래핑하고 SWIG 생성 클래스를 수정하거나 SWIG typemap을 사용할 수 있다고 생각합니다. 그러나 이것이 공통적이라고 생각할 수있는 원형 솔루션입니다. 상태.
string
헤더의 코드에 액세스하는 데 문제가있을 수 있다고 생각했지만 int
과 같은 typedef를 시도하면 동일한 문제가 발생합니다.
template<typename T>
class Wrapper
{
public:
Wrapper(T x) : data(x){};
T data;
T operator()() { return data; };
};
그리고 테스트 테스트에 해당하는 %template
지침 :
%template(Message) Wrapper<std::string>;
불행하게도,이 몇 가지가있는 것
내 가장 좋은 방법은 지금까지의 래퍼 템플릿이었다한다 지금까지의 단점 :
operator()
을 호출하십시오. 즉,test.Message('a')()
을 호출해야합니다.- 일부 조건부 컴파일을 사용하거나 wrapper를 typedef와 다른 이름으로 지정해야합니다. 그렇지 않은 경우
test.say
은 래퍼 또는 문자열을 허용하지 않으므로 전혀 사용할 수 없습니다. - 구성시 오류가있는 열거 형과 작동하지 않는 것 같습니다.
나는 또한 내가 영리한 것으로 바꿀지도 모른다고 생각했다. operator*
은 감싸는 것을 되돌려 놓았지만, 어쨌든 반환 된 것은 감싸는 듯했다.
'std :: string'은'POC' 타입이 아니고 메모리가 힙에 할당 되었기 때문에'stat char *'를 사용하는 것이 좋을 것입니다. 힙은 디버그 이건 릴리즈 이건 다르게 작동합니다. 나는'% include "std_string.i"를 포함시킴으로써'std :: string' 인스턴스를 생성 할 수있을 것으로 기대합니다. 이것을 인수로 사용해 보셨습니까? –
내 기대가 잘못되었지만 인터페이스에서 POC 유형을 사용하는 것이 좋습니다. –
'% include std_string.i' 또는 % import std_string.i'에서 문자열을'std_string.i' 템플릿'string'으로'basic_string'으로 인스턴스화 할 수 있기를 기대합니다. 이상하게도, 그것들 중 어느 것도 인스턴스를 생성 할 수있는 객체를 가져 오는 것 같지 않습니다. 아마도 SWIG가 문자열을 대상 언어 문자열에 매핑하여 문자열을 처리하는 것 같습니다. –
danielunderwood