C++ 如何将boost数组表示为类型的指针?

C++ 如何将boost数组表示为类型的指针?,c++,pointers,boost,C++,Pointers,Boost,我使用boost数组作为缓冲区,并希望将其作为参数传递给函数。我希望传递它的方式是,将大小确定为另一个参数,以便我可以传递不同大小的缓冲区。目前,我的代码如下: void DataTransform(boost::array<char, 1024> data) { //do something } 如何展开boost数组以将其表示为指针?如果您有一个类似char arr[SOME_SIZE]的普通数组;然后arr将衰减为指向其第一个元素的指针。也就是说,arr将衰减为&ar

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

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

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

如果您有一个类似char arr[SOME_SIZE]的普通数组;然后arr将衰减为指向其第一个元素的指针。也就是说,arr将衰减为&arr[0]

获取boost::array或,就此而言,以及的元素的地址也是有效的,并给出相同的结果

因此,要获得指向boost::数组的第一个元素的指针,只需执行以下操作:例如&data[0]

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

您可以使用值模板参数作为boost::array的大小,如中所示

数组的数据返回指向数组开头的指针,大小返回数组中的元素数:

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
    }
}
对于普通阵列,我可以使用:

void DataTransform(char* data, uint_16 size) {
    //do something
}
void DataTransform(char* data, uint_16 size) {
    //do something
}
您也可以使用boost::array实现这一点,但这将是一个倒退。有很好的理由,为什么容器管理它们的大小,而你不必做簿记

如果你想要这个

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

PS:我不太满意Booo::SART::SIEZHYTYPE,也将打开一个新的问题……< /P> < P>你可以使用C++ 20,它是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}); 
参见在线示例

void DataTransform(boost::array<char, 1024> data) {
    //do something
}
#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);
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});