Cython:如何使用模板?

2024-10-01 02:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我想对下面的模板化C++类进行CythoNo:

template <typname T>
class Fc2Par
{
public:
  Fc2Par(std::string const& par_file)
  ~Fc2Par()
  std::vector<Box<T>> convert_boxes(std::vector<Box<T>> const& boxes) const;
  std::vector<Point<T>> convert_points(std::vector<Point<T>> const& points) const;
private:
  PartitionMap<T>  par_map;
  PartitionRTree<T> par_idx;
};

事实上,T是双倍的。Box/Point是额外的模板类,但我不确定是否要在python中公开它。我有以下几点,但我在某些方面遇到了困难。我想我可以用熔合式T?在

^{pr2}$

理想情况下,我希望在python中使用API,如下所示:

boxes_int = [(0,0,1,1), (0,0,2,2), ...]
boxes_float = [(0.0,0.0,1.0,1.0), (0.0,0.0,2.0,2.0), ...]

fc2par = PyFc2Par('foo.csv')
converted_int = fc2par.convert_boxes(boxes_int)
converted_float = fc2par.convert_boxes(boxes_float)

它们返回一个元组列表,其中包含xmin、xmax、ymin、ymax。在

我的问题:

  1. 在这种情况下使用保险丝类型正确吗?

  2. 如果我有一个元组列表,如何在Cython代码中将它们转换成Box[T]/Point[T],而不在Python中公开这些类?一旦我得到结果,我就可以把它转换回元组列表并发送回去。i、 e.转换盒的实现应该是什么样子?

谢谢你的帮助。在


Tags: box模板convert列表floatintpoint元组
1条回答
网友
1楼 · 发布于 2024-10-01 02:39:56

问题1-不幸的是你不能在那里使用融合类型。(参见前面关于这个主题的问题:c++ class in fused typeCython: templates in python class wrappers)。您必须为每个不同的变体创建一个单独的包装器。e、 g.:

cdef class PyFc2ParInt:
  cdef Fc2Par[int]* thisptr
  # etc ...

cdef class PyFc2ParDouble:
  cdef Fc2Par[double]* thisptr
  # etc ...

不幸的是,这涉及到许多不可避免的代码重复。在

问题2。if convert_points的实现实质上涉及遍历Python列表,创建方框,然后遍历向量来创建Python列表。大致轮廓如下:

^{pr2}$

请注意,您需要告诉Cython关于Boxcdef extern from ...),即使您随后没有将其公开给Python。在

相关问题 更多 >