模板类中的Cython C静态方法

前端之家收集整理的这篇文章主要介绍了模板类中的Cython C静态方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题

我在C中有一个模板类,它有一个静态方法.它看起来或多或少是这样的:

template<typename T>
class Foo {
    static std::shared_ptr<Foo<T>> doSth();
}

所以在C中你会称之为:Foo< Int> :: doSth();.但是在Cython中,调用静态方法的方式是使用classname作为命名空间:

cdef extern from "Bar.h" namespace "Bar":
    shared_ptr[Bar] doSth()  # assuming shared_ptr is already declared

但这没有模板的概念.显然,简单地通过Foo< T>因为命名空间不起作用,因为它在C中转换为Foo< T> :: doStr(),没有具体的类型被替换为T.

你如何在Cython中做到这一点?有办法还是解决办法?

解决方法

注意:这个答案是正确的,当它被写(并仍然工作),但你现在应该使用 @Robertwb’s answer to this question instead这样做.

我不认为你可以直接在Cython中做.您可以创建一个非常薄的包装器(非静态方法)c模板函数

template <typename T>
std::shared_ptr<Foo<T>> Foo_T_doSth<T>() {
   return Foo<T>::doSth();
}

然后将该方法包装在Cython中

cdef extern from "..."
    shared_ptr[T] Foo_T_doSth[T]()

除此之外,推荐的方法是在Cython中包装静态方法(从https://groups.google.com/forum/#!topic/cython-users/xaErUq2yY0s开始)

cdef extern from "...":
   cdef Foo_doSth "Foo::doSth"()  # not declared as a memeber

(通过指定用作字符串的实际函数).这并不能帮助你,因为它不适用于模板.这可能是我错过的建议你的方式你正在尝试…

猜你在找的C&C++相关文章