如何将升压数组表示为类型的指针?

How to represent boost array as a pointer of a type?

本文关键字:类型 指针 表示 数组      更新时间:2023-10-16

我正在使用一个提升数组作为缓冲区,并希望将其作为参数传递给函数。我想传递它的方法是将大小确定为另一个参数,以便我可以传递不同大小的缓冲区。目前,我的代码如下:

void DataTransform(boost::array<char, 1024> data) {
//do something
}

使用普通数组,我本可以使用:

void DataTransform(char* data, uint_16 size) {
//do something
}

我将如何解开 boost 数组以将其表示为指针?

如果你有一个像char arr[SOME_SIZE];这样的普通数组,那么arr衰减指向其第一个元素的指针。也就是说,arr会衰减到&arr[0].

获取boost::array元素的地址(或者,就此而言,std::arraystd::vector(也是有效的,并给出相同的结果。

因此,要获取指向boost::array的第一个元素的指针,您只需执行例如&data[0].


但是,如果您不想处理指针,还有另一种方法可以处理您的问题:模板。

您可以使用模板参数来表示boost::array的大小,如

template<size_t N>
void DataTransform(boost::array<char, N>& data) { ... }

然后,您可以将包含任意大小char元素的boost::array传递给函数。大小将由编译器简单地推断出来:

boost::array<char, 512> data1;
boost::array<char, 1024> data2;
...
DataTransform(data1);
DataTransform(data2);

>boost::array有一个返回指向数组开头的指针的data()方法,以及一个返回数组中元素数的size()方法:

DataTransform(some_array.data(), some_array.size())

另一种选择是重新设计 DataTransform 方法以处理迭代器:

template<typename T, typename U>
DataTransform(T begin, U end) {
for(; begin != end; ++begin) {
// do something with *begin
}
}

然后你可以这样称呼它:

DataTransform(std::begin(some_array), std::end(some_array))
DataTransform(some_c_array, some_c_array + some_c_array_size)
DataTransform(std::begin(some_list), std::end(some_list))

对于一个普通的数组,我本可以使用:

void DataTransform(char* data, uint_16 size) {
//do something
}

你也可以用boost::array做到这一点,但这将是倒退。有充分的理由,为什么容器管理它们的大小,而你不必做簿记。

如果你想要这个

void DataTransform(boost::array<char, 1024> data) {
//do something
}

为了接受不同大小的boost::array,我建议通过使其成为模板来参数化大小上的函数:

#include <stdio.h>
#include <boost/array.hpp>
template <boost::array<char,1>::size_type size>
void DataTransform(boost::array<char, size> data) {
//do something
}
int main(void)
{
boost::array<char,10> x;
boost::array<char,20> y;
DataTransform(x);
DataTransform(y);

}

PS:我对boost::array<char,1>::size_type也不是那么满意,并且会就此提出一个新问题......

您可以使用c++ 20std::span<T>这是对内存中某处 T 类型的连续值序列的非常轻量级的抽象。

请参阅什么是"跨度",何时应使用? .

这个容器旨在解决你的问题,你的函数接口可以用非常清晰的方式声明:

void DataTransform(std::span<char> data) {
//do something
for (std::size_t i = 0; i < data.size(); i++) {
// ...
}
}

你可以这样做:

boost::array<char, 512>  d1;
boost::array<char, 1024> d2;
std::array<char, 512>    d3;
std::vector<char>        d4(512);
char                     d5[512];
DataTransform(d1);
DataTransform(d2);
DataTransform(d3);
DataTransform(d4);
DataTransform(d5); 
// Pass same buffer of varying size
DataTransform({d5, 256}); 

请参阅在线 godbolt 示例。