我具有以下功能:
uint_fast32_t write(const std::vector<std::byte>& bytes_to_write) const
{
...
}
我想用std::byte
s的可变数量来调用它:
std::byte low_byte { 0 };
std::byte hi_byte{ GPIO_PINS::GPIOH0 | GPIO_PINS::GPIOH3 };
write({
INST::SET_LOW,
low_byte,
0xFB,
INST::SET_HI,
hi_byte,
0xFF
});
在这方面,(INST
和GPIO_PINS
是enum class : byte
-注意byte
(实际上是unsigned char
)和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_cast
)的需要?
也许是某些隐式操作符覆盖等?
答案 0 :(得分:6)
“是否有一种方法可以将枚举类隐式转换为std :: byte? -不。
类型安全枚举不允许隐式转换为其他类型。您必须使用演员表。
答案 1 :(得分:3)
enum class
的全部目的是不能隐式转换为其基础类型(并限制其值)。如果您需要隐式转换,那么您就需要使用简单的enum
,或者自己编写转换。
通过将常规enum
放入enum class
中,可以使行为像enum
的隐式可转换namespace
。这样,它的值就可以作用于名称空间,但是您可以得到常规枚举提供的隐式转换。
答案 2 :(得分:1)
不可能这样做。用户定义的隐式转换必须通过构造函数或转换运算符进行。但是构造函数和转换运算符都必须是类成员,这当然不能枚举。
答案 3 :(得分:1)
很遗憾,无法为enum class
定义转换运算符。
不过,要实现您的目标,您可以使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) + ...);
}
(我假设函数返回要写入的字节数,因此请使用+
作为折叠运算符)