【问题标题】:Wrapping C++ template function/method in Cython在 Cython 中包装 C++ 模板函数/方法
【发布时间】:2012-02-01 16:37:39
【问题描述】:

我正在尝试用 Cython 包装一些 C++ 代码。我有一个使用模板方法的类,但它本身不是模板。

class SomeClass {
    template <class T> SomeClass(T& spam);
};

由于类不是模板,而只是构造函数,所以我不能像这样在 Cython 中将类声明为模板。

# wrong!
cdef extern from "SomeClass.h":
    cppclass SomeClass [T]:
        SomeClass(T& spam)

如何包装模板方法?

【问题讨论】:

  • Cython 对 C++ 的支持仍然非常有限,所以很可能你不能。不过我不确定。想到的一种解决方法是为您实际使用此构造函数的类型指定重载。

标签: c++ templates methods cython word-wrap


【解决方案1】:

简单。 (或者我认为是)在 C++ 类中,成员是模板化的,而在 Cython 中,您声明要模板化的类。将您的代码更改为:

template <class T>
class SomeClass {
    SomeClass(T& spam);
};

如果可行,或:

cdef extern from "SomeClass.h":
    cppclass SomeClass:
        SomeClass [T](T& spam)

如果 Cython 支持它。

我不是 cython 专家,所以我可能错了。

【讨论】:

  • 前者是不可行的/等效的,而后者则不能像所介绍的那样工作。 (知道是否有一些支持或一些解决方法会很有趣。)
  • 从 0.19 版开始,文档只提到了模板类,没有提到模板方法。 docs.cython.org/src/userguide/wrapping_CPlusPlus.html
  • 根据this,似乎不支持模板方法,仅支持模板类
【解决方案2】:

用于 cython 的 Boost 包装器怎么样?

http://www.boost.org/doc/libs/1_54_0/libs/python/doc/index.html

欢迎使用 Boost.Python 的第 2 版,这是一个 C++ 库,可实现 C++ 和 Python 编程语言之间的无缝互操作性。新版本从头开始重写,界面更加方便灵活,并提供许多新功能,包括支持: 引用和指针 全局注册类型强制 自动跨模块类型转换 高效的函数重载 C++ 到 Python 异常翻译 默认参数 关键字参数 在 C++ 中操作 Python 对象 将 C++ 迭代器导出为 Python 迭代器 文档字符串

我猜你正在寻找类似的东西,它已经作为 boost c++ 库的一部分存在

【讨论】:

  • 我不确定你想说什么。
【解决方案3】:

对于非构造函数模板方法,使用如下非模板类:

class SomeClass {
    template <class T> void other(T& spam);
};

我能够让它工作:

cdef extern from "someclass.h":
    cppclass SomeClass:
        void other[T](T &spam)

如果您特别需要构造函数模板方法,这可能对您没有帮助,但似乎 Cython 对模板方法的支持自最初提出此问题以来至少略有改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2019-05-28
    相关资源
    最近更新 更多