C++模板,用于通过常量引用和原始指针传递向量

C++ template for both passing a vector by constant reference and raw pointer

本文关键字:原始 指针 向量 引用 常量 模板 用于 C++      更新时间:2023-10-16

(在这种情况下,琐碎的模板专业化不是灵丹妙药!(

我正在编写一些图像处理代码,并与一些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声明为指针和向量?我可以直接复制代码,但我宁愿不复制,因为这是一个相当复杂的快速算法实现。

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

我想我找到了一个更简单的解决方案。我只需要让向量专门化包含算法代码,并将原始指针投射到向量自己的专门化中。然后,我将让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
);
}