将枚举传递给重载函数

Passing enum to overload function

本文关键字:重载 函数 枚举      更新时间:2023-10-16

我试图将一个基本上是字节的枚举传递给重载解析,但它不起作用。

以下是枚举:

enum class WriteOp : uint8_t {
  kAdd = 0,
  kDelete
};

以下是过载:

 void copy_out(uint8_t& v) { getn((char*) &v, 1); }
 void copy_out(uint16_t& v) { getn((char*) &v, 2); }
 void copy_out(uint32_t& v) { getn((char*) &v, 4); }
 void copy_out(uint64_t& v) { getn((char*) &v, 8); }

下面是我收到的一个典型的错误消息:

main.cpp:164:8: note: candidate function not viable: no known conversion from 'WriteOp' to 'uint8_t &' (aka 'unsigned char &') for 1st argument
void copy_out(uint8_t& v) { getn((char*) &v, 1); }

有什么简单优雅的方法吗?

template<class E,
  std::enable_if_t<std::is_enum<E>{}>* = nullptr
>
void copy_out(E& e){
  getn(reinterpret_cast<char*>(&e),sizeof(e));
}

如果你要取一个枚举,就取一个enum。

上面采用任何枚举,并执行getn

通过一点重构,您可以将对getn的所有调用及其不安全的强制转换移到一个函数中。

您有一个强类型枚举,它们的全部意义在于它们不能隐式转换,并且可以具有作用域。你可以做三件事中的一件:

  1. 为您的类型创建重载:void copy_out(WriteOp& v) { getn((char*) &v, 1); }
  2. 显式强制转换枚举copy_out(&(uint8_t)my_enum);
  3. 使用标准枚举

enum WriteOp {
  kAdd = 0,
  kDelete
};