有没有一种方法可以将枚举类隐式转换为std :: byte?

时间:2019-04-15 15:25:24

标签: c++ c++17

我具有以下功能:

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
    });
在这方面,

INSTGPIO_PINSenum 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)的需要?

也许是某些隐式操作符覆盖等?

4 个答案:

答案 0 :(得分:6)

“是否有一种方法可以将枚举类隐式转换为std :: byte? -不。

类型安全枚举不允许隐式转换为其他类型。您必须使用演员表。

另请参阅:https://en.cppreference.com/w/cpp/language/enum

答案 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) + ...);
}

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