C++ 将枚举传递给重载函数
我试图将基本上是一个字节的枚举传递给重载解析,但它不起作用 以下是枚举:C++ 将枚举传递给重载函数,c++,enums,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&
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); }
有什么简单而优雅的方法可以做到这一点吗?您有一个强类型枚举,其要点是它们不是隐式可转换的,并且可以有作用域。您可以执行以下三种操作之一:
void copy_out(WriteOp&v){getn((char*)&v,1);}
copy_out(&(uint8_t)my_enum)代码>
您有一个强类型枚举,其要点是它们不是隐式可转换的,并且可以具有作用域。您可以执行以下三种操作之一:
void copy_out(WriteOp&v){getn((char*)&v,1);}
copy_out(&(uint8_t)my_enum)代码>
模板
作废复印件(E&E){
getn(重新解释铸件和铸件),尺寸(e));
}
如果要获取枚举,请获取枚举
上面使用任何枚举,并执行getn
通过一点重构,您可以将对getn
的所有调用及其不安全强制转换移动到一个函数中。模板
作废复印件(E&E){
getn(重新解释铸件和铸件),尺寸(e));
}
如果要获取枚举,请获取枚举
上面使用任何枚举,并执行getn
通过一点重构,您可以将对
getn
的所有调用及其不安全强制转换移动到一个函数中。使WriteOp重载?您有一个强类型枚举,其目的是使其成为不同的类型(即不隐式强制转换)。您应该强制转换它或进行重载。enum类
的一个特殊特性是它不是隐式可转换的。如果需要,请使用普通的枚举
@Frank,您必须显式地将作用域枚举数转换为所需类型。“我正在尝试传递枚举”不,您没有。“基本上是一个字节”不,不是。使WriteOp重载?您有一个强类型枚举,其目的是使它成为不同的类型(即不隐式强制转换)。您应该强制转换它或进行重载。enum类
的一个特殊特性是它不是隐式可转换的。如果需要,请使用普通的枚举
@Frank,您必须显式地将作用域枚举数转换为所需类型。“我正在尝试传递枚举”不,您没有。“基本上是一个字节”不,不是。请注意,许多编译器支持非类大小的枚举。哦,您确定eum可以隐式转换为对其底层类型的引用吗?或者它的底层类型是这些类型中的一种?请注意,许多编译器都支持大小为非类的枚举。哦,您确定eum可以隐式转换为对其底层类型的引用吗?或者它的底层类型就是这些类型之一?
enum WriteOp {
kAdd = 0,
kDelete
};
template<class E,
std::enable_if_t<std::is_enum<E>{}>* = nullptr
>
void copy_out(E& e){
getn(reinterpret_cast<char*>(&e),sizeof(e));
}