SWIG:对同一模板使用不同的名称(stl向量)

时间:2015-03-25 14:53:12

标签: c# c++ stl swig

我们正在使用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。

谢谢!

0 个答案:

没有答案