C++ 是否可以将非枚举值作为枚举函数参数传递?
我有一个函数如下所示:C++ 是否可以将非枚举值作为枚举函数参数传递?,c++,unit-testing,enums,reinterpret-cast,C++,Unit Testing,Enums,Reinterpret Cast,我有一个函数如下所示: std::string SomeClass::convertStateToString(StateE state) const { std::string stateAsString; switch (state) { case UNKNOWN: stateAsString = "UNKNOWN"; break; case OFFLINE: stateAsString = "OFFLINE"; b
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;
}
其中,状态定义为:
typedef enum
{
UNKNOWN = 0,
OFFLINE = 1,
ENABLED = 2,
DISABLED = 3
} StateE;
出于单元测试的目的,我想向convertStateToString
提供一些坏数据,并验证是否返回了“异常”
。这可能吗
换句话说,是否可以将枚举范围之外的值作为In参数传递给函数,其中函数的签名表示该参数为枚举类型
在尝试了指针和重新解释转换之后,我几乎准备好声明函数convertStateToString
在任何情况下都不能返回“异常”
任何方法都不太老练 >无论C++试图执行适当的类型检查有多少种方式, 仍然可以只获取内存位置的地址并更改其内容。 例如:声明StateE类型的变量,获取其地址,在其中写入超出范围的值,然后将其传递给函数。
不管变量在C++中如何执行适当的类型检查,变量可能是不稳定的。 仍然可以只获取内存位置的地址并更改其内容。 例如:声明StateE类型的变量,获取其地址,在其中写入超出范围的值,然后将其传递给函数。
变量可能应该是易变的。您可以在单元测试中写入以下内容:
convertStateToString(static_cast<StateE>(10));
convertStateToString(静态_cast(10));
这将强制您的代码通过交换机/机箱的“默认值”。您可以在单元测试中编写:
convertStateToString(static_cast<StateE>(10));
convertStateToString(静态_cast(10));
这将强制您的代码以开关/机箱的“默认值”传递。我看不出问题:
std::string convertStateToString(StateE state);
int main() {
std::cout << convertStateToString(StateE(30)) << "\n";
}
我看不出有什么问题:
std::string convertStateToString(StateE state);
int main() {
std::cout << convertStateToString(StateE(30)) << "\n";
}
像您想要强类型枚举的接缝:像您想要强类型枚举的接缝:是的,结果是reinterpret_cast是问题是的,结果是reinterpret_cast是问题是的,静态_cast起作用,reinterpret_cast不起作用。我现在觉得有点傻:)是的,静态的演员可以工作,重新解释的演员不能。我现在觉得有点傻:)