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

问题描述 投票:0回答:1

我有这么长的字节列表(例如,它们不代表字符或整数)。
目前,我只能做以下事情:

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

我想要的是将

char
替换为
std::byte
,但编译器抱怨

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

我看到了一些建议,但我认为其中没有合适的:

  1. 将每个字节包装在
    std::byte()
    调用中。
    虽然这肯定是解决这个问题的最简单方法,但我希望我们能够理解这看起来是多么荒谬。
  2. static const std::byte* myByteArray= reinterpret_cast<const std::byte*>(myArray);

    这是 *a* 解决方案,但我失去了查询大小的能力 (
    sizeof myByteArray
    ),并且我必须处理额外的变量。
  3. 使用可变参数模板函数,如此答案
    中所述 该解决方案改变了我正在使用的数据类型。也许我只是经验不够,但我不相信
    std::array
    定义静态数组。
  4. 用户定义的文字。
    与第(1)点类似,但更短。我可以重载
    _b
    并将其应用到每个元素。这仍然让我希望有一个解决方案,让我不必触摸列表中的每个项目。

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

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

c++ arrays types std std-byte
1个回答
0
投票

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

#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 的常量转换。

© www.soinside.com 2019 - 2024. All rights reserved.