SWIG%ignore与typedef的模板不匹配

时间:2012-11-26 17:24:43

标签: c++ templates swig ignore

我有一个模板化的Vector(如在数学向量中,而不是std :: vector)类,可以使用2到4之间的大小进行实例化。定义类似于:

template <uint32_t Size, typename StorageType>
class Vector
{
public:
  Vector(StorageType x, StorageType y);
  Vector(StorageType x, StorageType y, StorageType z);
  Vector(StorageType x, StorageType y, StorageType z, StorageType w);
  ...
};

在我的SWIG文件中,我想要打包一个Size 3StorageType int8_t的版本,所以

%module Vector
%{
#include "Vector.h"
%}

%include "stdint.i"
%include "Vector.h"

%ignore Vector(int8_t, int8_t);
%ignore Vector(int8_t, int8_t, int8_t, int8_t);
%template(Vector3DInt8) PolyVox::Vector<3,int8_t>;

但它未能%ignore请求的构造函数。

似乎在%template宏内的SWIG会自动从模板参数中“删除”typedef,因此%template(Vector3DInt8) PolyVox::Vector<3,int8_t>;实际上会转换为%template(Vector3DInt8) PolyVox::Vector<3,unsigned char>;。因此,由于%ignoreunsigned char不匹配,int8_t不匹配。

如果我在其中一个我想要忽略的函数中添加static_assert(),我会得到:

source/Vector.inl: In constructor ‘Vector<Size, StorageType>::Vector(StorageType, StorageType) [with unsigned int Size = 3u, StorageType = signed char]’:
build/PolyVoxCorePYTHON_wrap.cxx:6446:100:   instantiated from here
source/Vector.inl:56:3: error: static assertion failed: "This constructor should only be used for vectors with two elements."

我也试过使用-notemplatereduce,但似乎没有效果。

有没有办法让SWIG正确地忽略不需要的构造函数?

编辑:我正在使用GCC 4.5和SWIG 2.0.8

编辑2:将stdint.i添加到.i文件,因为Python类型地图需要它。如果没有stdint.i%ignore可以正常工作,但需要在Python中实际使用绑定。

0 个答案:

没有答案