我有一个模板化的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
3
和StorageType
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>;
。因此,由于%ignore
与unsigned 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中实际使用绑定。