【问题标题】:Passing enum to overload function将枚举传递给重载函数
【发布时间】:2015-08-20 05:24:20
【问题描述】:

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

这里是枚举:

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

有什么简单而优雅的方法吗?

【问题讨论】:

  • 使 WriteOp 重载?
  • 你有一个强类型枚举,这样做的目的是使它成为一个不同的类型(即不隐式转换)。您应该强制转换或重载。
  • enum class 的一个特殊功能是它不能隐式转换。如果需要,请使用普通的enum
  • @Frank 您必须明确地将作用域枚举数转换为所需的类型。
  • “我正在尝试传递一个枚举” 不,你不是。 “这基本上是一个字节” 不,它不是。

标签: c++ enums


【解决方案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 的调用及其不安全的强制转换为一个函数。

【讨论】:

    【解决方案2】:

    您有一个强类型枚举,它们的重点是它们不能隐式转换并且可以具有范围。您可以做 3 件事中的 1 件事:

    1. 为您的类型创建重载:void copy_out(WriteOp&amp; v) { getn((char*) &amp;v, 1); }
    2. 显式转换您的枚举copy_out(&amp;(uint8_t)my_enum);
    3. 使用标准枚举。

    enum WriteOp {
      kAdd = 0,
      kDelete
    };
    

    【讨论】:

    • 请注意,许多编译器支持大小的非类枚举。哦,您确定 eum 可以隐式转换为对其基础类型的引用吗?或者它的基础类型是这些类型之一?
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2014-07-14
    • 2017-02-07
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多