2015-03-13 185 views
0

我有一个功能,看起来像这样:凡StateE定义是否可以将非枚举值作为枚举函数参数传递?

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并验证我得到"ABNORMAL"背部。这可能吗?

换句话说,是否有可能将一个超出枚举范围的值作为参数内函数传递给函数的签名表示该参数属于枚举类型的函数?

经过指针和reinterpret_cast的实验后,我几乎可以声称功能convertStateToString不能在任何情况下返回"ABNORMAL"

没有任何方法太冒昧!

+1

接缝像你想强类型枚举:http://www.cprogramming.com/c++11/ C++ 11-nullptr-strong-typed-enum-class.html – NathanOliver 2015-03-13 14:26:23

回答

2

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

convertStateToString(static_cast<StateE>(10)); 

这将迫使你的代码在你的交换机/盒的“默认”的通过。

+0

是的,static_cast工作,reinterpret_cast不工作​​。我现在感觉有点傻:) – Martin 2015-03-13 14:34:34

1

不管C++试图执行适当的类型检查的方式有多少,它应该仍然可以取得内存位置的地址并更改其内容。 例如:声明一个类型为StateE的变量,获取其地址,在其中写入一个超出范围的值,然后将其传递给该函数。 可能变量应该是易变的。

1

我没有看到这个问题:

std::string convertStateToString(StateE state); 

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

输出:

ABNORMAL 
+0

是的,事实证明reinterpret_cast是问题 – Martin 2015-03-13 14:33:51