我们正在使用SWIG为应用程序接口创建C#和Python的包装类。
接口为STL容器使用了几个typedef,其中一些用于相同的特化。
运行SWIG时,在生成的C#文件中,包装函数始终返回与参数列表匹配的第一个定义模板的实例。但是,生成的C ++包装器模块使用了正确的typedef。
以下代码段是一个非常简化的.i文件,用于说明问题:
%module swig
%include "std_vector.i"
%template(WrappedVectorOfInts) std::vector<int>;
%template(WrappedIntVector) std::vector<int>;
%template(WrappedAnotherIntVector) std::vector<int>;
typedef std::vector<int> IntVector;
typedef std::vector<int> AnotherIntVector;
std::vector<int> GetVectorOfInts();
IntVector GetIntVector();
AnotherIntVector GetAnotherIntVector();
这导致了以下CSharp类:
public class swig {
public static WrappedVectorOfInts GetVectorOfInts() {
WrappedVectorOfInts ret = new WrappedVectorOfInts(swigPINVOKE.GetVectorOfInts(), true);
return ret;
}
public static WrappedVectorOfInts GetIntVector() {
WrappedVectorOfInts ret = new WrappedVectorOfInts(swigPINVOKE.GetIntVector(), true);
return ret;
}
public static WrappedVectorOfInts GetAnotherIntVector() {
WrappedVectorOfInts ret = new WrappedVectorOfInts(swigPINVOKE.GetAnotherIntVector(), true);
return ret;
}
}
生成的CXX文件包含正确键入的包装器方法:
SWIGEXPORT void * SWIGSTDCALL CSharp_GetVectorOfInts() {
void * jresult ;
std::vector< int > result;
result = GetVectorOfInts();
jresult = new std::vector< int >((const std::vector< int > &)result);
return jresult;
}
SWIGEXPORT void * SWIGSTDCALL CSharp_GetIntVector() {
void * jresult ;
IntVector result;
result = GetIntVector();
jresult = new IntVector((const IntVector &)result);
return jresult;
}
SWIGEXPORT void * SWIGSTDCALL CSharp_GetAnotherIntVector() {
void * jresult ;
AnotherIntVector result;
result = GetAnotherIntVector();
jresult = new AnotherIntVector((const AnotherIntVector &)result);
return jresult;
}
我已尝试使用%clear和%apply,但我似乎总是犯错,因为我从来没有达到预期的效果。
有没有办法强制SWIG在生成的C#界面中使用正确的类型名?
我们目前正在Windows上使用SWIG-3.0.2。
谢谢!