C++模板,用于通过常量引用和原始指针传递向量
C++ template for both passing a vector by constant reference and raw pointer
(在这种情况下,琐碎的模板专业化不是灵丹妙药!(
我正在编写一些图像处理代码,并与一些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
);
}
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?