如何正确施放?(或者我应该这样做吗?)

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().这种特殊方法当然不是我的一大担心.:)我担心的是更普遍的情况,当我得到一个永远不应该是负数的整数时,但理论上可能是由于错误.

哎呀,我可能正在编写一个方法来执行此操作,以便覆盖另一段代码 - 所以我无法更改签名.我的代码肯定会有错误,即使我不指望它.

在这种情况下,我该怎么办?

GMa*_*ckG 6

你能改变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.但是,一般来说,您应该信任该文档.

  • 我假设`CString`来自Windows MFC. (2认同)