Обвивам 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 в шаблон.
%rename
или изрично инстанциране на членски функции, типове членове и т.н., напр.%template (SomeClassSomeMemberFunction) SomeClass::SomeMemberFunction<float>
подобно за typedef в рамките на класове. Един съвет обаче е да създадете чиста C обвивка на функциите от Eigen, които искате да изложите - това е много по-просто - person Jens Munk   schedule 06.09.2015SomeFunction(T**, size_t, size_t,....)
и обгръща 3-те първи аргумента в матрица на целевия език, напр. матрица NumPy в Python. - person Jens Munk   schedule 07.09.2015