Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法将枚举类隐式转换为std::byte?_C++_C++17 - Fatal编程技术网

C++ 有没有办法将枚举类隐式转换为std::byte?

C++ 有没有办法将枚举类隐式转换为std::byte?,c++,c++17,C++,C++17,我有以下功能: uint_fast32_t write(const std::vector<std::byte>& bytes_to_write) const { ... } (INST和GPIO_引脚是enum class:byte-注意byte(实际上是无符号字符)和std::byte)之间的区别,在这方面….) 但这不会编译。我必须对通话进行如下调整: write({ std::byte(INST::SET_LOW), low_byte,

我有以下功能:

uint_fast32_t write(const std::vector<std::byte>& bytes_to_write) const
{
    ...
}
INST
GPIO_引脚
enum class:byte
-注意
byte
(实际上是
无符号字符
)和
std::byte
)之间的区别,在这方面….)

但这不会编译。我必须对通话进行如下调整:

write({
    std::byte(INST::SET_LOW),
    low_byte,
    std::byte(0xFB),
    std::byte(INST::SET_HI),
    hi_byte,
    std::byte(0xFF)
    });
我的问题是,是否有一种方法可以消除对
std::byte
构造函数(或
static\u cast
)的需要

可能是某个隐式运算符重写之类的?

“有没有办法将枚举类隐式转换为std::byte?”-没有

类型安全枚举不允许隐式转换为其他类型。你必须使用石膏


另请参见:

不可能这样做。用户定义的隐式转换必须通过构造函数或转换运算符进行。但是构造函数和转换运算符都必须是类成员,而枚举当然不能有这些成员。

枚举类的全部目的是不隐式地转换为其基础类型(并限定其值的范围)。如果您需要隐式转换,那么您需要退回到使用普通的
enum
,或者自己编写强制转换


通过将常规的
枚举
放入
命名空间
中,可以创建一个类似于
枚举类
的隐式可转换的
枚举
。这样一来,它的值的作用域就是名称空间,但您可以得到常规枚举提供的隐式转换。

不幸的是,无法为
枚举类定义转换运算符

但是,为了实现您的目标,您可以将write函数设置为泛型,以便能够传递不同类型的参数:

template <typename Enum>
uint32_t write(Enum e)
{
    static_assert(std::is_enum<Enum>::value && sizeof(e) == 1, "");
    // write enum
}

uint32_t write(std::byte b)
{
    // write enum
}

template <typename ...Args>
uint32_t write(Args... args)
{
    return (write(args) + ...);
}
模板
uint32_t写入(枚举e)
{
静态断言(std::is_enum::value&&sizeof(e)==1,”;
//写入枚举
}
uint32_t写入(标准::字节b)
{
//写入枚举
}
模板
uint32_t写入(Args…Args)
{
返回(写入(args)+…);
}

(我假设函数返回正在写入的字节数,因此使用
+
作为折叠运算符)

您能否详细说明或将您的答案转换为注释?事实上,它看起来确实像一个意见。@YSC“不(它不能做)”怎么像一个意见?如果做不到,在我看来这就是事实。@YSC这不是一种观点,它是一个事实,无论在语义上还是技术上。@SergeyA事物是什么和事物看起来是什么之间有着内在的区别。对你们来说,对我来说,正如我们从经验中所知道的,杰斯珀是对的,这是事实。对于不喜欢(OP)的人来说,这可能是两者兼而有之。由于杰斯珀的陈述可以得到证据的支持,我要求他这样做。这有什么不对?@YSC:“既然杰斯珀的陈述可以得到证据的支持,我就让他这么做了。”不,你没有。如果你想让他引用标准或以其他方式提供证据,你应该特别提出要求。你们说的“精心设计”,这可能真的意味着什么。这个在临时向量的构造函数中传递独立字节序列的整个构造似乎相当可疑。为什么不使用某种有意义的结构或生成器,直接接受
INST::SET_LOW
之类的值?@VTT,为什么看起来可疑?我想传递可变的字节数。“有意义的结构或构建器”是什么意思?因为传递的字节没有意义。我不能将
INST
enum值、数值和
std::byte
组合在一起,因为
uint32\u t write(Args…Args)
函数期望值的类型相同。我的意思是我不能调用:
write(INST::SET_LOW,LOW_byte/*类型std::byte*/,0xFB)
,因为输入变量的类型不同。@Tar,为什么不呢<代码>参数可以是不同类型的列表。以下是一个可编译的示例:
template <typename Enum>
uint32_t write(Enum e)
{
    static_assert(std::is_enum<Enum>::value && sizeof(e) == 1, "");
    // write enum
}

uint32_t write(std::byte b)
{
    // write enum
}

template <typename ...Args>
uint32_t write(Args... args)
{
    return (write(args) + ...);
}