初始化程序列表作为数组的函数参数传递
Initialiser list passed as function parameter for array
如何实现这一点:
void foo(uint8_t a[]) { ... }
foo({0x01, 0x02, 0x03});
它给了我一个错误:
error: cannot convert '<brace-enclosed initializer list>' to 'uint8_t* {aka unsigned char*}' for argument '1'
^
这对我来说很有效,我不得不更改函数签名,但实际上在我的情况下更好,因为它静态地检查数组长度:
void foo(std::array<uint8_t, 3> a) { /* use a.data() instead of a */ }
foo({0x01, 0x02, 0x03}); // OK
foo({0x01, 0x02}); // Works, at least on GCC 4.9.1. The third value is set to zero.
foo({0x01, 0x02, 0x03, 0x04}); // Compilation error.
到目前为止的答案还没有解决这个问题的主要问题:在签名中
void foo(uint8_t a[])
a
不是一个数组,而是指向uint8_t
的指针。尽管a
的声明使它看起来像一个数组。错误消息甚至指出了这一点:
cannot convert '<brace-enclosed initializer list>' to 'uint8_t* {aka unsigned char*}'
所以,以同样的方式,你不允许这样做:
uint8_t *a = {0x01, 0x02, 0x03}; // Eek! Error
你不能用上面的签名打电话给foo({0x01, 0x02, 0x03});
。
我建议您花一些时间来阅读C风格数组,以及它们在C++中如何不是一流的公民。
从你发布的答案到你自己的问题,似乎你正在寻找一个适用于固定大小数组的函数。但不要按价值传递!我建议使用以下声明:
void foo(std::array<uint8_t, 3> const &a);
您不能。只需构建
uint8_t a[] = {0x01, 0x02, 0x03};
并调用CCD_ 5。
或者只使用std::array
,这可能更好。
这:
void foo(uint8_t a[]) { ... }
是一个采用uint8_t*
的函数,而不是数组——当用作函数参数时,数组会衰减为指针。问题是初始化器列表(如{0x01, 0x02, 0x03}
(无法转换为uint8_t*
。
如果您想要将任意数量的uint8_t
s传递给foo
,那么简单的解决方案是使用新的std::initializer_list
void foo(std::initializer_list<uint8_t> a) { ... }
foo({0x01, 0x02, 0x03, 0x04, 0x05}); // OK - a has 5 elems in it
或者你可以采用一个可变包,并在内部构建一个数组:
template <typename... Args,
typename = std::enable_if_t<
all_true<std::is_convertible<Args, uint8_t>::value...>
>>
void foo(Args... elems) {
uint8_t a[] = {elems...};
// ...
}
其用法略有不同:
foo({0x01, 0x02, 0x03}); // error
foo(0x01, 0x02, 0x03; // OK - a has 3 elems in it
foo(std::array<uint8_t, 3>{0x01, 0x02, 0x03}.data());
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称