SWIG C++;模板类的接口 我想为我的C++类创建一个Python接口。 此类依赖于某些模板参数,这些参数部分由关键字“using”声明,SWIG仅部分支持该关键字。 这就是为什么我想在SWIG接口文件中更直接地声明它们。不幸的是,只有未注释的部分编译,例如functor_gaussianF作为参数,它抱怨没有声明它 这是我如何定义C++标题中的函子:< /p> 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> >; 使用函子的模板\u gaussian=DistFunction; 使用functor_bubble=DistFunction的模板; 使用函子的模板\u cutgaussian=DistFunction; 使用函子_epanechicov=DistFunction的模板; 使用函子_=DistFunction的模板;

SWIG C++;模板类的接口 我想为我的C++类创建一个Python接口。 此类依赖于某些模板参数,这些参数部分由关键字“using”声明,SWIG仅部分支持该关键字。 这就是为什么我想在SWIG接口文件中更直接地声明它们。不幸的是,只有未注释的部分编译,例如functor_gaussianF作为参数,它抱怨没有声明它 这是我如何定义C++标题中的函子:< /p> 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> >; 使用函子的模板\u gaussian=DistFunction; 使用functor_bubble=DistFunction的模板; 使用函子的模板\u cutgaussian=DistFunction; 使用函子_epanechicov=DistFunction的模板; 使用函子_=DistFunction的模板;,python,c++,swig,Python,C++,Swig,这里,在接口文件中,我无法使用它们,但需要以某种方式再次定义它们: %{ #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_de

这里,在接口文件中,我无法使用它们,但需要以某种方式再次定义它们:

%{
#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>;
  */
}
%{
#包括“SOMNet.h”
%}
%包括“SOMNet.h”
名称空间ANN{
%模板(函子_gaussianF)距离函数;
%模板(函子_bubbleF)DistFunction;
%模板(函子_cutgaussianF)距离函数;
%模板(函子)DistFunction;
%模板(函子_mexicanF)DistFunction;
%模板(SOMNetGaussF)SOMNet;
/*
%模板(somnebubblef)SOMNet;
%模板(SOMNetCGaussF)SOMNet;
%模板(SOMNetEpanF)SOMNet;
%模板(SOMNetMexicanF)SOMNet;
*/
}

只是一个建议。您可以考虑实例化所有模板,并编写需要包装的函数的非模板版本。通过这种方式,您可以为您的语言创建一个合适的ABI,并让您的SWIG包装器链接到一个共享对象。现在我明白了为什么在库中使用实例化:)使用模板的共享库(.so或.dll)可能会变得复杂。您需要显式地实例化所有内容,如果您的接口上有非POD类型,则很容易在堆分配方面遇到问题。这只是一个建议。您可以考虑实例化所有模板,并编写需要包装的函数的非模板版本。通过这种方式,您可以为您的语言创建一个合适的ABI,并让您的SWIG包装器链接到一个共享对象。现在我明白了为什么在库中使用实例化:)使用模板的共享库(.so或.dll)可能会变得复杂。您需要显式地实例化所有内容,如果接口上有非POD类型,则很容易在堆分配方面遇到问题。