如何将升压数组表示为类型的指针?
How to represent boost array as a pointer of a type?
我正在使用一个提升数组作为缓冲区,并希望将其作为参数传递给函数。我想传递它的方法是将大小确定为另一个参数,以便我可以传递不同大小的缓冲区。目前,我的代码如下:
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::array
和std::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 示例。
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- (C )找到基本类型指针的儿童类型
- 表达式必须具有指向对象的指针类型(指针向量)
- 将子项复制构造到父类型指针中
- C 返回类型指针声明
- 调用虚拟函数而不通过类类型指针创建任何对象
- C++ 如何使用类类型指针制作向量
- 为什么基类型指针不能获取派生类对象的地址值?
- 如何在 C++ 中获取映射类型指针,映射
- 如何检查该类型的类型指针是正确对齐的
- 正在转换为短类型指针
- 指向任意类方法的模板非类型指针
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 指向shared_ptr的不透明类型 C 指针
- C++:从值类型指针强制转换为包含迭代器
- C/C++:访问给定类型指针的位置与访问另一类型指针的相同位置不同
- 比较类型指针
- 数据类型指针使用*(Datatype *)
- 如何打印c++中char类型指针的所有值