【问题标题】:SWIG, passing python list to C++SWIG,将 python 列表传递给 C++
【发布时间】:2021-11-03 08:51:47
【问题描述】:

我正在尝试创建比较两个向量的 C++ 扩展。

ddd.h 文件

using namespace std;

#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>
#include <iostream>
#include <assert.h>
#include <cstring>

vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);

ddd.i 文件

%module ddd

%{
#define SWIG_FILE_WITH_INIT
#include "ddd.h"
%}

%include "std_vector.i"

namespace std {
    %template(Line)  vector<string>;
    %template(Array) vector<vector<string> >;
}

%{
extern vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);
// extern vector<string> Line;
// extern vector<vector<string> > Array;
%}


%include ddd.h
extern vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);
// extern vector<string> Line;
// extern vector<vector<string> > Array;

ddd.cpp 文件

#include "ddd.h"

// vector<bool> comparer_cpp(const vector<vector<string> >& v, const vector<string>& v0) {
  vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0) {

  
    vector<bool> result;

    for(unsigned int i=0;i<v.size();i++)
    {
      result.push_back((v0==v[i]));
    }

    // for(unsigned int i=0;i<result.size();i++)
    // {
    //   cout<<result[i]<<endl;
    // }


    return result;
}

编译通过,没有错误

但是,当我测试代码时,我无法将 python 列表传递给 C++ 向量

>>> import ddd
>>> ddd.Line(["F06", "H10", "R07"])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/young/Downloads/temp/cpp_swig_test/swig/ddd.py", line 201, in __init__
    _ddd.Line_swiginit(self, _ddd.new_Line(*args))
TypeError: Wrong number or type of arguments for overloaded function 'new_Line'.
  Possible C/C++ prototypes are:
    std::vector< string >::vector()
    std::vector< string >::vector(std::vector< string > const &)
    std::vector< string >::vector(std::vector< string >::size_type)
    std::vector< string >::vector(std::vector< string >::size_type,std::vector< string >::value_type const &)

我的最终目标是比较两个向量并得到以下结果

vec1d=ddd.Line(["F06", "H10", "R07"])
vec2d=ddd.Line([["F06", "H10", "R07"], ["F06", "H10", "L20"], ["F06", "H10", "S12"]])
result_tuple=ddd.comparer_cpp(vec2d,vec1d)

请纠正我做错了什么

【问题讨论】:

  • 这不是你问题的答案,但你也可以考虑pybind11。

标签: python c++ swig


【解决方案1】:

您需要 std_string.i 以便 SWIG 理解 std::string,以及 std::vector&lt;bool&gt; 的模板。这是一个经过测试的示例:

ddd.i

%module ddd

%include "std_vector.i"
%include "std_string.i"
%template(Line)  std::vector<std::string>;
%template(Array) std::vector<std::vector<std::string>>;
%template(Result) std::vector<bool>;

%inline %{
#include <vector>
#include <string>

std::vector<bool> comparer_cpp(std::vector<std::vector<std::string>> v, std::vector<std::string> v0) {
    std::vector<bool> result;
    for(unsigned int i=0; i < v.size(); ++i) {
      result.push_back(v0 == v[i]);
    }
    return result;
}
%}

test.py

import ddd

vec1d = ddd.Line(["F06", "H10", "R07"])
vec2d = ddd.Array([["F06", "H10", "R07"], ["F06", "H10", "L20"], ["F06", "H10", "S12"]])
result = ddd.comparer_cpp(vec2d,vec1d)
print(result)

输出:

(True, False, False)

【讨论】:

    【解决方案2】:

    尝试为带有%include "std_string.i" 的字符串包含相关的 SWIG 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2022-09-24
      • 2016-09-15
      • 2011-06-21
      相关资源
      最近更新 更多