python 模板类_Cython:Python类包装器中的模板

正如您所说,Cython并不真正支持这一点.

我认为到目前为止,最简单的方法是使用字符串替换手动生成一堆Cython文件.从“ foowrapper.pxi.src”文件(您想要的名称…)开始:

cdef class PyFoo_{T}:

cdef Foo[{T}] *thisptr

def __cinit__(self, param):

self.thisptr = new Foo[{T}](param)

# etc

接下来,通过一个简单的程序(也可能是Python)运行它以加载文件,进行字符串替换并以新名称再次保存文件.关键是:

output = code.format(T=T) # where T is a string with a C++ class name

# e.g. "int" or "std::vector"

(显然有一些与加载和保存有关的代码已被我懒洋洋地跳过了)

然后,在您的Cython文件中,您只需“包括”每个类的生成文件. Cython中的“ include”命令是文字文本包含(如C预处理器),并且需要一个.pxi文件:

cdef extern from "header.h":

cdef cppclass Foo[T]:

Foo(T param)

# ...

include "foowrapper_int.pxi"

include "foowrapper_vectordouble.pxi

# etc

您必须选择在编译时生成的类,但这是不可避免的(模板是编译时功能),因此您将永远无法从Python脚本环境动态生成它们,因为赢得了相应的C类无法生成.

其他选择

其他几个选项值得简要考虑.首先,您可以继承Foo< T>来自不依赖于模板参数的基类(例如FooBase).然后,将FooBase包装在Cython中(针对您关心的情况生成类似构造函数的函数).仅当要调用的函数没有依赖于模板类型的参数时,这才真正可行.显然,这还涉及更改C代码.

section选项用于查看另一种包装方式. Boost Python当然会本地支持(但有其自身的缺点).我想SIP / SWIG也可以应付(但我不知道).如果有必要,您可以很干净地将它们与Cython混合搭配(通过导入包含模板类的生成模块).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值