C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了模板类中的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

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

大佬总结

以上是大佬教程为你收集整理的模板类中的Cython C静态方法全部内容,希望文章能够帮你解决模板类中的Cython C静态方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。