【发布时间】:2021-12-31 00:09:36
【问题描述】:
问题
有没有办法使用模板为 Cython 包装的 C++ 类创建 Python 包装器? (即完全按照此处显示的内容进行操作,但使用模板:http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#create-cython-wrapper-class)。
我知道融合类型的解决方法 (https://groups.google.com/forum/#!topic/cython-users/qQpMo3hGQqI),但这不允许您实例化像 vector<vector<int>> 这样的类:毫无疑问,融合类型没有递归的概念。
改写
我想要实现的是一个像这样的包装类:
cdef extern from "header.h":
cdef cppclass Foo[T]:
Foo(T param)
# ...
创建一个简单的 Python 包装器:
cdef class PyFoo[T]: # I know the '[T]' can't be here, it's a wish
cdef Foo[T] *thisptr
def __cinit__(self, param):
self.thisptr = new Foo[T](param)
# ...
我很确定 Cython 本身不支持这一点,但也许有人可以想到一个解决方法。我不是在寻找惯用的或好的例子,我只是想知道这是否有可能。
【问题讨论】:
-
如何通过某种字符串替换运行它来为每个
T生成不同的源文件? -
所以本质上做 C++ 编译器对模板所做的事情,但对于 cython 包装器?我已经考虑过了。这绝对是我正在考虑的一个选项,尽管它以某种方式扩展了 cython 编译器并且做了大量工作。
-
我想我的意思要简单得多:1) 创建一个包含
cdef class PyFoo_{T}: cdef Foo[{T}] *thisptr等的文件。2) 通过执行.format(T='std::vector<int>')生成一堆cython 文件,并保存结果。 3) 将这些文件包含在您的主要 Cython 文件中(语法include "filename.pxi")。您显然必须选择要手动生成的类,但您总是必须这样做。 -
哦,你是对的,它要简单得多。还有一件更棘手的事情:如何知道要生成哪些“实例化”?我必须事先知道所有用法(再次,就像 C++ 一样)。但是,似乎没有更好的选择。
-
嗯,你需要在编译 Cython 代码时就全部了解它们(从 Python 解释器按需动态生成它们当然是不可能的)。
标签: python c++ templates cython