Как да гарантирам, че typedefs в шаблон също се преместват?

Обвивам C++ клас (PointMatcher.h ) за C# с помощта на SWIG. Използвах директивата %template, за да конкретизирам клас шаблон, както следва:

%include "../pointmatcher/PointMatcher.h"

%template(PointMatcherFloat) PointMatcher<float>;

Оказва се обаче, че шаблонът PointMatcher<T> съдържа дефиниции на типове и имена на типове, базирани на <T> и те не са включени в обвивката на SWIG. (По-конкретно, имам нужда от достъп до TransformationParameters по-долу.)

//! The scalar type
typedef T ScalarType;
//! A vector over ScalarType
typedef typename Eigen::Matrix<T, Eigen::Dynamic, 1> Vector;
//! A vector of vector over ScalarType, not a matrix
typedef std::vector<Vector, Eigen::aligned_allocator<Vector> > VectorVector;
//! A quaternion over ScalarType
typedef typename Eigen::Quaternion<T> Quaternion;
//! A vector of quaternions over ScalarType
typedef std::vector<Quaternion, Eigen::aligned_allocator<Quaternion> > QuaternionVector;
//! A dense matrix over ScalarType
typedef typename Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> Matrix;
//! A dense integer matrix
typedef typename Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> IntMatrix;

//! A matrix holding the parameters a transformation.
/**
    The transformation lies in the special Euclidean group of dimension \f$n\f$, \f$SE(n)\f$, implemented as a dense matrix of size \f$n+1 \times n+1\f$ over ScalarType.
*/
typedef Matrix TransformationParameters;

// alias for scope reasons
typedef PointMatcherSupport::Parametrizable Parametrizable; //!< alias
typedef Parametrizable::Parameters Parameters; //!< alias
typedef Parametrizable::ParameterDoc ParameterDoc; //!< alias
typedef Parametrizable::ParametersDoc ParametersDoc; //!< alias
typedef Parametrizable::InvalidParameter InvalidParameter; //!< alias

Опитах да дублирам декларациите по-горе като %inline блок, използвайки T и float. (Както е описано в документацията на SWIG 3.0 за typedef.) И в двете случаите typedef са просто включени в .cxx файла, но не се генерират свързани класове или методи.

Как да се уверя, че тези типове са налични в PointMatcherFloat?


Бележка за редактиране: Преди това мислех, че става въпрос за шаблони за членове (като Как да инстанцирам шаблонен метод на шаблонен клас с swig? и Как да накарам SWIG да прилага шаблони при опаковане на шаблонен клас, съдържащ вектори?), но всъщност става въпрос за typedefs/typenames в шаблон.


person lofidevops    schedule 01.09.2015    source източник
comment
Допълнение: докато работех върху друг метод, открих, че typedef, който ме интересува (TransformationParameters), всъщност се генерира като SWIGTYPE_p_Eigen__MatrixT_float_Eigen__Dynamic_Eigen__Dynamic_t. Как мога да го преименувам на TransformationParametersFloat и да се появи в конкретизирания клас PointMatcherFloat?   -  person lofidevops    schedule 03.09.2015
comment
Можете да използвате синтаксиса %rename или изрично инстанциране на членски функции, типове членове и т.н., напр. %template (SomeClassSomeMemberFunction) SomeClass::SomeMemberFunction<float> подобно за typedef в рамките на класове. Един съвет обаче е да създадете чиста C обвивка на функциите от Eigen, които искате да изложите - това е много по-просто   -  person Jens Munk    schedule 06.09.2015
comment
@JensMunk благодаря - в какъв ред правя извикванията за преименуване и/или шаблон (спрямо моето съществуващо извикване на шаблон)   -  person lofidevops    schedule 07.09.2015
comment
Както предложих, бих създал функция, която не е шаблонна функция, която изисква по-прости типове в своя интерфейс и вместо това бих обвил това, напр. функция с прототип SomeFunction(T**, size_t, size_t,....) и обгръща 3-те първи аргумента в матрица на целевия език, напр. матрица NumPy в Python.   -  person Jens Munk    schedule 07.09.2015
comment
Тук е даден пример за преименуване на вложени шаблони: stackoverflow.com/questions/9757642/   -  person Jens Munk    schedule 07.09.2015