C++ 如何将boost数组表示为类型的指针?
我使用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
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});