在Cython中包装C++模板函数/方法

8

我正在尝试使用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++ 的支持仍然非常有限,所以很可能不能。虽然我不确定。一个想到的解决办法是为您实际使用此构造函数的类型指定重载。 - Cat Plus Plus
3个回答

2

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

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

我成功实现了这个:

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

如果您需要特定的构造函数模板方法,那么这可能对您没有帮助,但是看起来自此问题最初提出以来,Cython对模板方法的支持至少有所改善。


0

很简单。(或者我认为是这样的)在C++类中,成员是模板化的,而在Cython中,你需要声明类是模板化的。要更改你的代码,请选择以下任一方式:

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

如果可行,或者:
cdef extern from "SomeClass.h":
    cppclass SomeClass:
        SomeClass [T](T& spam)

如果Cython支持它。
我不是Cython专家,所以可能会有错误。

前者不可行/等效,后者按照所述不起作用。(如果有支持或解决方法会很有趣。) - Mike Graham
从版本0.19开始,文档仅提到了模板类,没有提到模板方法。 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html - Laurent LA RIZZA
3
根据这里的内容,似乎不支持模板方法,只支持模板类。 - maxywb

-1
怎么看 Boost 对 Cython 的包装器?

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

欢迎来到Boost.Python的第二版,这是一个能够实现C++和Python编程语言之间无缝互操作性的C++库。新版已经完全重写,拥有更方便灵活的接口,并且增加了许多新功能,包括支持: 引用和指针 全局注册类型转换 自动跨模块类型转换 高效的函数重载 C++到Python异常转换 默认参数 关键字参数 在C++中操作Python对象 将C++迭代器导出为Python迭代器 文档字符串
我猜你可能在寻找像这样的东西,它已经作为Boost C++库的一部分存在。

我不确定你想表达什么意思。 - Mike Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接