我正在尝试将基本上是一个字节的枚举传递给重载解决方案,但是它不起作用。

这是枚举:

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

如果要枚举,请枚举。

上面接受任何枚举,并执行getn

只需进行一点重构,就可以将所有调用移至getn,并将其不安全的类型转换为一个函数。

09-11 17:33