我正在尝试将基本上是一个字节的枚举传递给重载解决方案,但是它不起作用。
这是枚举:
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
,并将其不安全的类型转换为一个函数。