У меня есть шаблонный класс 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
запрошенные конструкторы.
Кажется, что SWIG, внутри %template
макрос автоматически удаляет 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.
Задача ещё не решена.
Других решений пока нет …