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