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