是否可以将非枚举值作为枚举函数参数传递?

Is it possible to pass a non-enum value as an enum function parameter?

我有一个看起来像这样的函数:

std::string SomeClass::convertStateToString(StateE state) const
{
  std::string stateAsString;
  switch (state)
  {
    case UNKNOWN:
      stateAsString = "UNKNOWN";
      break;
    case OFFLINE:
      stateAsString = "OFFLINE";
      break;
    case ENABLED:
      stateAsString = "ENABLED";
      break;
    case DISABLED:
      stateAsString = "DISABLED";
      break;
    default:
      stateAsString = "ABNORMAL";
      break;
  }
  return stateAsString;
}

其中 StateE 定义为:

typedef enum
{
  UNKNOWN      = 0,
  OFFLINE      = 1,
  ENABLED      = 2,
  DISABLED     = 3
} StateE;

出于单元测试目的,我想向 convertStateToString 提供一些错误数据并验证我是否得到 "ABNORMAL"。这可能吗?

换句话说,是否可以将枚举范围之外的值作为输入参数传递给函数签名表明参数是枚举类型的函数?

在尝试了指针和 reinterpret_cast 之后,我几乎准备好声称函数 convertStateToString 在任何情况下都不能 return "ABNORMAL".

任何方法都不过分!

无论 C++ 尝试以多少种方式强制执行正确的类型检查, 应该仍然可以只获取内存位置的地址并更改其内容。 例如:声明一个 StateE 类型的变量,获取它的地址,在其中写入一个超出范围的值,然后将它传递给函数。 可能变量应该是 volatile.

你可以在你的单元测试中这样写:

convertStateToString(static_cast<StateE>(10));

这将强制您的代码传入 switch/case 的 "default"。

我没有看到问题:

std::string convertStateToString(StateE state);

int main() {
    std::cout << convertStateToString(StateE(30)) << "\n";
}

输出:

ABNORMAL