如何禁用std :: vector <std :: vector <double>&gt;的自动映射swig python中的元组元组?</std :: vector <double>

时间:2013-05-02 12:28:22

标签: python swig

显然,swig会自动将std::vector<std::vector<double> >转换为元组元组。我想防止这种情况,我希望保持原样。我怎样才能实现它?我尝试为类型

指定一个定义
%template(StdVectorStdVectorDouble) std::vector<std::vector<double> >;

但显然它不起作用。

1 个答案:

答案 0 :(得分:1)

两种技巧:

  1. %clear SWIG处理函数前类型的类型映射。
  2. 在SWIG处理函数后声明%template
  3. 示例1

    %module x
    
    %begin %{
    #pragma warning(disable:4127 4211 4701 4706)
    %}
    
    %include <std_vector.i>
    %template(vd) std::vector<double>;
    %template(vvd) std::vector<std::vector<double> >;
    %clear std::vector<std::vector<double> >;
    
    %inline %{
    #include<vector>
    std::vector<std::vector<double> > func()
    {
        std::vector<std::vector<double> > temp;
        std::vector<double> a;
        a.push_back(1.5);
        temp.push_back(a);
        return temp;
    }
    %}
    

    示例2

    %module x
    
    %begin %{
    #pragma warning(disable:4127 4211 4701 4706)
    %}
    
    %include <std_vector.i>
    
    %inline %{
    #include<vector>
    std::vector<std::vector<double> > func()
    {
        std::vector<std::vector<double> > temp;
        std::vector<double> a;
        a.push_back(1.5);
        temp.push_back(a);
        return temp;
    }
    
    %}
    
    %template(vd) std::vector<double>;
    %template(vvd) std::vector<std::vector<double> >;
    

    结果(两者)

    Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import x
    >>> x.func()
    <x.vvd; proxy of <Swig Object of type 'std::vector< std::vector< double,std::allocator<double > > > *' at 0x00000000025F6900> >