将枚举传递给重载函数

时间:2015-08-19 20:50:12

标签: c++ enums

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

这是枚举:

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); }

任何简单而优雅的方法吗?

2 个答案:

答案 0 :(得分:2)

你有一个强类型枚举这些内容的重点是它们不是可以隐式转换的,并且可以有范围。你可以做3件事之一:

  1. 为您的类型创建重载:void copy_out(WriteOp& v) { getn((char*) &v, 1); }
  2. 明确地投射您的枚举copy_out(&(uint8_t)my_enum);
  3. 使用标准枚举。
  4. enum WriteOp {
      kAdd = 0,
      kDelete
    };
    

答案 1 :(得分:2)

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,请选择enum。

以上内容采用任何枚举,并执行getn

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