2013-07-03 2 views
4

자바에서 사용할 수 있도록 C++ 라이브러리의 래퍼를 만들고 있습니다. Swig에서이 작업을 수행하고 있습니다.Swig로 특정 오버로드 된 메소드 무시하기

제가 직면 한 것은 클래스가 SomeClass이고 오버로드 된 메서드가 일부 있습니다 (someMethod). 이 오버로드 된 메서드 중 일부는 래퍼로 내보내고 싶지 않은 복잡한 데이터와 내가 내보낼 간단한 데이터를받습니다.

%rename("$ignore") 지시어를 사용하려고하는데 모든 메소드를 내보내거나 가져 오지 않습니다. SimpleData 클래스와 ComplexData 클래스 중 하나는 네임 스페이스 ns1이고 다른 하나는 ns2, SomeClass은 네임 스페이스 'ns3`입니다.

클래스 SimpleData :

#ifndef SIMPLEDATA_H_ 
#define SIMPLEDATA_H_ 

namespace ns1 { 

class SimpleData { 
public: 
    SimpleData(){} 
    virtual ~SimpleData(){} 
}; 

} /* namespace ns1 */ 
#endif /* SIMPLEDATA_H_ */ 

클래스 ComplexData :

#ifndef COMPLEXDATA_H_ 
#define COMPLEXDATA_H_ 

namespace ns2 { 

class ComplexData { 
public: 
    ComplexData(){} 
    virtual ~ComplexData(){} 
}; 

} /* namespace ns2 */ 
#endif /* COMPLEXDATA_H_ */ 

클래스 SomeClass :

의 I 파일 조각은 다음과 같습니다
#ifndef SOMECLASS_H_ 
#define SOMECLASS_H_ 

#include "SimpleData.h" 
#include "ComplexData.h" 

namespace ns3 { 

class SomeClass { 
public: 
    SomeClass(){} 
    bool someMethod(const ns1::SimpleData & data){return true;} 
    bool someMethod(const ns2::ComplexData & data){return true;} 
    bool someMethod(const int & data){return true;} 
    bool anotherMethod(); 
    virtual ~SomeClass(){} 
}; 

} /* namespace ns3 */ 
#endif /* SOMECLASS_H_ */ 

:

%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData&)"; 

하지만 작동하지 않습니다. 어떤 메소드의 특정 오버로드를 무시하는 올바른 방법은 무엇입니까?

전체 .I 파일 :

%module libSomeClass 

%{ 
    #include "../src/SomeClass.h" 
%} 

%pragma(java) jniclasscode=%{ 
    static { 
    try { 
     System.loadLibrary("SWIG_C++"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load. \n" + e); 
     System.exit(1); 
    } 
    } 
%} 

// SimpleData 
%include "../src/SimpleData.h" 

//removes too much 
//%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod"; 

//does not work 
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData &)"; 

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

%include "../src/SomeClass.h" 

참고 : 나는 실제로 그것을 생각 할 수 없다하지만 단지의 경우, 이러한 방법은 실제로 예외를 throw하지 않습니다.

주 2 : 관련성은 없지만 대상 언어는 Java이고 원본 언어는 C++입니다.

답변

2

이 솔루션은 메소드 서명 하지 따옴표를 사용하는 것입니다.

%rename ("$ignore", fullname=1) ns3::SomeClass::someMethod(const ns2::ComplexData &); 

내가 항상 가지고 있기 때문에 처음에 따옴표를 넣어 항상 예를 ​​들어, 나를 위해 일한 않았다

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

참조의 전체 .I 파일 :

%module libSomeClass 

%{ 
    #include "../src/SomeClass.h" 
%} 

%pragma(java) jniclasscode=%{ 
    static { 
    try { 
     System.loadLibrary("SWIG_C++"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load. \n" + e); 
     System.exit(1); 
    } 
    } 
%} 

// SimpleData 
%include "../src/SimpleData.h" 

%rename ("$ignore", fullname=1) ns3::SomeClass::someMethod(const ns2::ComplexData &); 

%ignore ns3::SomeClass::someMethod(const int &); 

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

%include "../src/SomeClass.h" 
6

% ignore 지시문 (http://www.swig.org/Doc1.3/SWIG.html#SWIG_rename_ignore) 만 사용해 보셨습니까? 무시하려는 기능과 가장 잘 어울리는 방법을 보려면 http://www.swig.org/Doc1.3/SWIGPlus.html#ambiguity_resolution_renaming을 확인하십시오.

또한 "이름 바꾸기 지시문의 배치는 선언 이름이 변경되기 전에 나타나는 한 임의입니다."는 함수 앞에 % 이름을 변경 했습니까?

(귀하의 예제에서는 클래스 이름 누락, 나는 그냥 오타 바로 가정?)

+0

문서는'% ignore'와'% rename ("$ ignore")'[정확히 일치 함] (http://www.swig.org/Doc2.0/SWIGDocumentation)을 언급하고있다.html # SWIG_advanced_renaming). '% rename'은 좀 더 유연합니다. 네, 제 '% rename'은 함수 선언 앞에 있습니다 (더 정확하게는'% include' 이전). 클래스 이름이 부족한 것은 오타입니다. 나는 해결책을 찾을 수 있었고, 이상한 방법 서명에서 ** 따옴표 **를 사용하는 것으로 보인다. 어쨌든 당신의 대답을 주셔서 감사합니다, 그것은 나를 통해 문서를 다시 통과하고 그 덕분에 나는 예제가 따옴표가 없다는 것을 깨달았습니다. –

관련 문제