【问题标题】:How to create SWIG interface file?如何创建 SWIG 接口文件?
【发布时间】:2012-11-13 12:35:24
【问题描述】:

我是 SWIG 的新手

而且做事的时间更少。 我正在尝试将 c++ 类绑定到 python。 我已经在 Windows 中设置了 SWIG 并尝试运行它。成功了

我的 example.i 文件是这样的

/* File: example.i */
%module example

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

但它似乎必须包含或声明头文件类、构造函数、模板等......

任何人都可以建议如何创建 SWIG 接口文件。

以下是我需要创建接口文件的头文件(Item.h)。

#ifndef __ITEM_H__
#define __ITEM_H__

#include <complex>
#include <functional>
#include <string>

template<typename T>
class Item
{
  std::string name_;
  T val_;

public:
  Item(std::string name, T val) : name_(name), val_(val) {}
  Item(Item<T> &rhs) : name_(rhs.name_), val_(rhs.val_) {}
  Item(const Item<T> &rhs) : name_(rhs.name_), val_(rhs.val_) {}
  ~Item() {}

  std::string name() const { return name_; }
  T operator()() const { return val_; }
  double norm() const { return sqrt(val_ * val_); }
};

template<>
class Item<std::complex<double> >
{
  std::string name_;
  std::complex<double> val_;

public:
  Item(std::string name, std::complex<double> val) : name_(name), val_(val) {}
  Item(Item<std::complex<double> > &rhs) : name_(rhs.name_), val_(rhs.val_) {}
  Item(const Item<std::complex<double> > &rhs) : name_(rhs.name_), val_(rhs.val_) {}
  ~Item() {}

  std::string name() const { return name_; }
  std::complex<double> operator()() const { return val_; }
  double norm() const { return sqrt(val_.real() * val_.real() + val_.imag() * val_.imag()); }
};

template<typename T>
struct ItemComparator : public std::binary_function<Item<T>, Item<T>, bool>
{
  inline bool operator()(Item<T> lhs, Item<T> rhs)
  {
    return lhs.norm() < rhs.norm();
  }
};

#endif

【问题讨论】:

  • 您希望如何将 C++ 模板类导出到 Python? AFAIK 一个只能导出专业化。另外,请勿使用以下划线开头的名称stackoverflow.com/questions/228783/…。
  • 您也可以考虑将boost.python 作为 SWIG 的替代品。我发现编写高质量的包装器比使用 SWIG 更容易。

标签: python swig


【解决方案1】:

这是您示例的接口文件。 SWIG 具有对 std::string 和 std::complex 的内置支持。您必须通过 %template 声明要使用的模板的具体类:

%module Item

%{
#include "Item.h"
%}

%include <std_string.i>
%include <std_complex.i>
%include "Item.h"
%template(Int) Item<int>;
%template(Complex) Item<std::complex<double> >;

像这样使用它:

>>> import Item
>>> a=Item.Int('Int1',5)
>>> b=Item.Complex('Cplx1',2+3j)
>>> a.name()
'Int1'
>>> b.name()
'Cplx1'
>>> a.norm()
5.0
>>> b.norm()
3.605551275463989

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多