Meh*_*dad 11 c++ integer casting visual-c++
如果我有代码如
class CString { int GetLength(); };
bool smaller(CString s1, std::string s2) {
return s2.size() > s1.GetLength();
}
Run Code Online (Sandbox Code Playgroud)
对我来说最好的事情是什么?
换s1.GetLength()
到(size_t)c.GetLength()
?
这将有助于摆脱关于"签名 - 无符号不匹配"的编译器警告,并传达我的演员意图,并且是迄今为止最简单的路线.但它可能不赞成.:(
换s1.GetLength()
到static_cast<size_t>(c.GetLength())
?
这将有助于摆脱警告,"正确"类型的演员.
换s1.GetLength()
到static_cast<std::string::size_type>(c.GetLength())
?
它非常冗长......这种抽象是否有实际的好处,或者我应该打破它?
保持原样?
这将有助于编译器使用/RTCc
开关进行溢出检查(我的主要关注点),但会以警告为代价.
做点别的吗?
我应该自己制作铸造功能吗?使用宏?我应该在运行时和编译时检查吗?还有其他想法吗?
似乎这个例子的字面意思太过分了......
我明明不是故意讲只是约CString::GetLength()
.这种特殊方法当然不是我的一大担心.:)我担心的是更普遍的情况,当我得到一个永远不应该是负数的整数时,但理论上可能是由于错误.
哎呀,我可能正在编写一个方法来执行此操作,以便覆盖另一段代码 - 所以我无法更改签名.我的代码肯定会有错误,即使我不指望它.
在这种情况下,我该怎么办?
你能改变GetLength()
吗?从根本上说,问题是长度永远不会消极,而无符号类型反映的是最好的.长度不应用a测量int
.
但除此之外,您的所有三种解决方案都是相同的.std::string::size_type
总是std::size_t
,虽然我会使用a static_cast
,但在这种情况下,C风格的强制转换会执行相同的强制转换.因为你知道返回的长度永远不会是负面的(顺便说一句,确保这一点;你永远不知道人们可能会做些什么奇怪的事情),你完全安全,只需转换类型:
return s2.size() > static_cast<std::size_t>(s1.GetLength());
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因CString::GetLength
可能是负面的,那么由您来决定如何将这种转换从负面变为正面.截短?幅度(绝对值)?无论你需要什么.
如果你担心错误,要么做一个明确的检查并抛出异常(取决于你的域,这可能是太昂贵),或使用assert
.但是,一般来说,您应该信任该文档.
归档时间: |
|
查看次数: |
523 次 |
最近记录: |