如何在C++中定义std::byte的静态数组?[复制]

How to define a static array of std::byte in C++? [duplicate]

提问人:Andi Abrudan 提问时间:11/18/2022 最后编辑:Jan SchultkeAndi Abrudan 更新时间:8/29/2023 访问量:508

问:

我有一长串字节(例如,它们不代表 chars 或 int)。
目前,我只能做以下事情:

static const char myArray[] = {0xb8, 0xfe, 0x6c, 0x39, 0x23, ...}

我想要的是替换为 ,但编译器抱怨charstd::byte

“int”类型的值不能用于初始化“const std::byte”类型的实体

我看到了一些建议,但我发现其中任何一个都不合适:

  1. 将每个字节包装在调用中。
    虽然这当然是最简单的修复方法,但我希望我们能体会到这看起来是多么荒谬。
    std::byte()
  2. static const std::byte* myByteArray= reinterpret_cast<const std::byte*>(myArray);
    这是*一个*解决方案,但我失去了查询大小 () 的能力,我必须处理一个额外的变量。sizeof myByteArray
  3. 使用可变参数模板函数,如本答案
    中所述 此解决方案更改了我正在使用的数据类型。也许我只是经验不足,但我不相信定义静态数组。
    std::array
  4. 用户定义的文本。
    与第(1)点相似,但更短。我可以重载并将其应用于每个元素。这仍然让我希望有一个解决方案,我不必触摸列表中的每个项目。
    _b

我也在考虑一个可以将字节构造函数应用于每个项目的可变宏,但宏不能是递归的,而且我一开始就对它们了解不够。

我遗漏了什么吗?让我知道是否有好的解决方案。

C++ 数组类型 std 字节

评论

0赞 tadman 11/18/2022
受苦是一样的吗?uint8_t
0赞 Thomas Matthews 11/18/2022
由于大多数系统上的 a 是无符号的 8 位整数,因此请尝试使用 。byteuint8_t
2赞 463035818_is_not_an_ai 11/18/2022
“但我不相信 std::array 来定义静态数组。” 为什么?A 实际上只是一个包裹在类中的 c 数组。std::array
0赞 Ted Lyngmo 11/18/2022
std::byte在纸上看起来不错,但由于这样的原因,我从未真正使用过它。
0赞 Jesper Juhl 11/18/2022
“我不相信 std::array 来定义静态数组。” - 严重地?你一定是在跟我开玩笑——这就是获得静态数组的方法。使用它。

答:

0赞 Bernd 11/18/2022 #1

您可以创建一个用户定义的文字运算符,例如(代码链接):

#include <cstddef>
#include <iostream>
#include <array>

constexpr std::byte operator""_b(unsigned long long int i){
    return static_cast<std::byte>(i);
}

static const std::array arr_cpp { 0xb8_b, 0xfe_b, 0x6c_b, 0x39_b, 0x23_b };

static const std::byte arr_c[] { 0xb8_b, 0xfe_b, 0x6c_b, 0x39_b, 0x23_b };

int main(){
    for(auto a : arr_cpp){
        std::cout << static_cast<int>(a) << "\n";
    }
    std::cout << "-----------\n";
    for(auto a : arr_c){
        std::cout << static_cast<int>(a) << "\n";
    }
   return 0; 
}

使用纯 c 数组或包装的 c++ 数组并不重要 - 在 c++ 中,没有从 int 到 std::byte 或 char 的常量转换。

评论

0赞 Neil Butterworth 11/18/2022
你说的“不断转换”是什么意思?
0赞 Bernd 11/18/2022
0xb8 是类型的文字 - int 不能隐式转换为 char/byte,即使常量值适合目标范围。例如,在 csharp 中,由于隐式常量转换,您可以创建这样一个带有整数文本的字节数组(请参阅:learn.microsoft.com/en-us/dotnet/csharp/language-reference/...)。int