我想为我的C ++类创建一个python接口。 这个类依赖于一些模板参数,这些参数已经被关键字"使用"部分声明,这只是SWIG的部分支持。 这就是为什么我想在SWIG接口文件中更直接地声明它们。不幸的是,只有未评论的部分可以编译,例如functor_gaussianF作为参数,它抱怨它没有被声明。
这就是我在C ++标题中定义函子的方法:
template<class T> using functor_gaussian = DistFunction<T, som_learn<T>, fcn_gaussian_nhood<T>, fcn_rad_decay<T>, fcn_lrate_decay<T> >;
template<class T> using functor_bubble = DistFunction<T, som_learn<T>, fcn_bubble_nhood<T>, fcn_rad_decay<T>, fcn_lrate_decay<T> >;
template<class T> using functor_cutgaussian = DistFunction<T, som_learn<T>, fcn_cutgaussian_nhood<T>, fcn_rad_decay<T>, fcn_lrate_decay<T> >;
template<class T> using functor_epanechicov = DistFunction<T, som_learn<T>, fcn_epanechicov_nhood<T>, fcn_rad_decay<T>, fcn_lrate_decay<T> >;
template<class T> using functor_mexican = DistFunction<T, som_learn<T>, fcn_mexican_nhood<T>, fcn_rad_decay<T>, fcn_lrate_decay<T> >;
这里,在接口文件中我不能使用它们,但需要以某种方式再次定义它们:
%{
#include "SOMNet.h"
%}
%include "SOMNet.h"
namespace ANN {
%template(functor_gaussianF) DistFunction<float, som_learn<float>, fcn_gaussian_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >;
%template(functor_bubbleF) DistFunction<float, som_learn<float>, fcn_bubble_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >;
%template(functor_cutgaussianF) DistFunction<float, som_learn<float>, fcn_cutgaussian_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >;
%template(functor_epanechicovF) DistFunction<float, som_learn<float>, fcn_epanechicov_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >;
%template(functor_mexicanF) DistFunction<float, som_learn<float>, fcn_mexican_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >;
%template(SOMNetGaussF) SOMNet<float, DistFunction<float, som_learn<float>, fcn_gaussian_nhood<float>, fcn_rad_decay<float>, fcn_lrate_decay<float> >>;
/*
%template(SOMNetBubbleF) SOMNet<float, functor_bubble>;
%template(SOMNetCGaussF) SOMNet<float, functor_cutgaussian>;
%template(SOMNetEpanF) SOMNet<float, functor_epanechicov>;
%template(SOMNetMexicanF) SOMNet<float, functor_mexican>;
*/
}