【问题标题】:Interfacing C++11 array with Cython将 C++11 数组与 Cython 连接
【发布时间】:2023-03-12 04:05:01
【问题描述】:

我习惯于构建 C++ 程序并在 Cython 中获取它,但在这里我试图获取 C++ 11 array,它肯定不起作用。

这是我的 .pxd:

cdef extern from "<array>" namespace "std" nogil :
    cdef cppclass array[T, size_t]:
        ctypedef T value_type
        cppclass iterator:
            T& operator*()
            iterator operator++()
            iterator operator--()
            iterator operator+(size_t)
            iterator operator-(size_t)
        bint operator==(iterator)
        bint operator!=(iterator)
        bint operator<(iterator)
        bint operator>(iterator)
        bint operator<=(iterator)
        bint operator>=(iterator)
        T& operator[](size_t)
        array() except +
        array(array&) except +

这个文件的大部分内容是对“vector.pxd”的改编,但我删除了分配器,因为 c++11 array 不需要它。我使用size_t 作为第二个模板参数,但我不确定。

问题是,当我这样做时:

    from array11 cimport array
    cdef array[int, 5] test   

编译时我明白了:

模板参数中的未知类型

如果我这样做:

    from array11 cimport array
    cdef array[int, 5] * test = new array[int, 5]()

我明白了:

new 运算符只能应用于 C++ 类

知道我做错了什么吗?

谢谢!

【问题讨论】:

  • cython 是否支持非类型模板?
  • 这可能是正确的问题!
  • @AndyG 不,它不支持非类型模板
  • 其他人已经提出了一些令人满意的工作方式。看看stackoverflow.com/questions/36357024/…的要旨
  • 所以没有办法实现std::array,在.pxd中没有固定大小?

标签: c++ arrays c++11 templates cython


【解决方案1】:

正如 cmets 中所讨论的,您遇到的问题是因为 Cython 并不真正支持非类型模板参数。一个解决方法(hacky 并且可能很脆弱)是诱使 Cython 认为它提供了一个类型模板参数:

cdef extern from "<array>" namespace "std" nogil :
    cdef cppclass two "2":
        pass

    cdef cppclass array[T, U]:
        T& operator[](size_t)
        # this is obviously very very cut down

def f():
    cdef array[int,two] x
    return x[0]+x[1]

诀窍在于,如果您这样做 cdef cppclass name "somestring",Cython 只会盲目地将 somestring 替换为名称,从而生成正确的 C++ 代码。这种方法显然有一些限制,但对于简单的使用来说应该没问题。

【讨论】:

  • 哇。它可能很脆弱,也可能很老套,但它确实很有创意。
猜你喜欢
  • 2021-07-17
  • 2016-08-17
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多