我试图将一个基本上是一个字节的枚举传递给重载分辨率,但它不起作用。
这是枚举:
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); }
任何简单而优雅的方法吗?
答案 0 :(得分:2)
你有一个强类型枚举这些内容的重点是它们不是可以隐式转换的,并且可以有范围。你可以做3件事之一:
void copy_out(WriteOp& v) { getn((char*) &v, 1); }
copy_out(&(uint8_t)my_enum);
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
及其不安全转换的调用移动到一个函数中。