如果我有诸如
class CString { int GetLength(); };
bool smaller(CString s1, std::string s2) {
return s2.size() > s1.GetLength();
}
对我来说最好的事情是什么?
更改
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()
。这种特殊的方法当然不是我的大担心。:) 我担心的是更一般的情况,即当我得到一个不应该为负的整数时,但理论上可能是由于错误。
哎呀,我可能正在编写一个这样做的方法,以覆盖另一段代码——所以我不能更改签名。我的代码肯定有错误,即使我没想到。
在这种情况下,我该怎么办?