SWIG - 如何使用带有'const double*'的构造函数将一个类包装到python中

Dan*_*ero -3 c++ python swig pointers

我必须使用Swig将C++中的矢量(几何向量)类包装到Python中.这个Vector3类的构造函数之一接受const double*:

Vector3(const double* list);
Run Code Online (Sandbox Code Playgroud)

我想将它包装起来,以便我可以在Python中执行此操作:

vec = Vector3([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Jen*_*unk 5

我建议将原型更改为

Vector(const double* list, size_t len);
Run Code Online (Sandbox Code Playgroud)

一个支持建筑使用的完整例子

import example
v = example.Vector([1.0,2.0,3.0])
Run Code Online (Sandbox Code Playgroud)

example.h文件

#pragma once
#include <cstdlib>

class Vector {
 public:
  Vector();
  Vector(double x, double y, double z);
  Vector(const double* list, size_t len);
};
Run Code Online (Sandbox Code Playgroud)

example.cpp

#include "example.h"
#include <iostream>

Vector::Vector() {
  std::cout << "Vector()" << std::endl;
}

Vector::Vector(double x, double y, double z) {
  std::cout << "Vector(double, double, double)" << std::endl;
}

Vector::Vector(const double* list, size_t len) {
  std::cout << "Vector(const double*)" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

example.i

%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

%include "numpy.i"

%init {
  import_array();
}

%apply (double* IN_ARRAY1, size_t DIM1)         \
{(const double* list, size_t len)}

%include "example.h"
Run Code Online (Sandbox Code Playgroud)

setup.py

from distutils.core import setup, Extension

setup(name="example",
      py_modules=['example'],
      ext_modules=[Extension("_example",
                     ["example.i","example.cpp"],
                     swig_opts=['-c++'],
                  )])
Run Code Online (Sandbox Code Playgroud)