我试图将Python接口写入一个相当大的模板化C ++类(具体来说,KDTreeSingleIndexAdaptor
仅用于构建KD树的nanoflann标头库中的{{3}}类。 / p>
此类的一个模板参数是通用DatasetAdaptor
类,我必须自己实现。 DatasetAdaptor
必须公开以下界面:
template <typename T>
class GenericDatasetAdaptor
{
// ...
public:
// Must return the number of data points
inline int kdtree_get_point_count() const { ... }
// Returns the dim'th component of the idx'th point in the class
inline T kdtree_get_pt(const int idx, int dim) const { ... }
// Optional bounding-box computation: return false to default to a standard bbox computation loop.
template <class BBOX>
bool kdtree_get_bbox(BBOX& /* bb */) const { return false; }
};
我希望能够将[npoints, ndim]
Cython类型的内存视图作为KDTreeSingleIndexAdaptor
的输入数据传递。如果我在纯Cython中实现DatasetAdaptor
,它可能看起来像这样:
cdef class MemoryviewAdaptor:
cdef double[:, :] data
def __cinit__(self, data):
self.data = data
cdef inline int kdtree_get_point_count(self):
return self.data.shape[0]
cdef inline double kdtree_get_pt(self, const int idx, const int dim):
return self.data[idx, dim]
cdef inline bint kdtree_get_bbox(self):
return False
如何设计类似于Cython类型的内存视图的接口,将这些方法暴露给C ++类?