首页 > 解决方案 > 通过常量引用和原始指针传递向量的 C++ 模板

问题描述

(在这种情况下,简单的模板专业化并不是灵丹妙药!)

我正在处理一些图像处理代码,并正在与一些 Cython 交互。要与 Cython 交互,我需要将原始指针传递给函数以避免复制开销。我意识到在某些情况下使用布尔图像来节省内存会很好,所以理想情况下我可以将声明更改为:

template <typename T>
uint32_t* connected_components(
    T* in_labels, ...
)

对此:

template <typename T>
uint32_t* connected_components(
    const std::vector<T> &in_labels, ...
)

但是,为了支持位压缩情况,我不能只将向量的容器转换为特化中的指针,我需要保留向量类的语义。

有没有办法编写这个模板,让它既声明in_labels为指针又声明为向量?我可以只复制代码,但我不想这样做,因为它是快速算法的一个相当复杂的实现。

编辑:我想一个巨大的宏会起作用......但它很难看。

标签: c++templatesvector

解决方案


我想我想出了一个更简单的解决方案。我只是让向量特化包含算法代码,并将原始指针转换为它自己的特化中的向量。然后,我将让 Cython 与指针特化交互,而其他用途可以默认为向量特化。

template <typename T>
uint32_t* connected_components3d_26(
    const std::vector<T> &in_labels, 
    const int64_t sx, const int64_t sy, const int64_t sz,
    int64_t max_labels, uint32_t *out_labels = NULL
  ) {

    // algorithm goes here
}


template <typename T>
uint32_t* connected_components3d_26(
    T* in_labels, 
    const int64_t sx, const int64_t sy, const int64_t sz,
    int64_t max_labels, uint32_t *out_labels = NULL
  ) {

  std::vector<T> vec_in_labels;
  vec_in_labels.assign(in_labels, in_labels + sx * sy * sz);

  return connected_components3d_26(
    vec_in_labels, 
    sx, sy, sz,
    max_labels, out_labels
  );
}

推荐阅读