gpt4 book ai didi

c++ - 如何正确施法? (或者我应该这样做吗?)

转载 作者:可可西里 更新时间:2023-11-01 15:12:55 25 4
gpt4 key购买 nike

如果我有这样的代码

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 进行溢出检查。 switch(我在这里主要关心的问题),以警告为代价。

  • 做点别的吗?
    我应该制作自己的类型转换功能吗?使用宏?我应该在运行时和编译时检查吗?还有其他想法吗?

编辑:

这个例子似乎有点过于字面意思了......

我显然不是想只是谈论CString::GetLength() .这种特殊的方法当然不是我的一个大问题。 :) 我担心的是更一般的情况,即当我得到一个永远不会应该为负数但可能的整数时em> 理论上是,由于错误。

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

遇到这种情况,我该怎么办?

最佳答案

你能改变 GetLength() 吗?从根本上说,问题在于长度永远不会为负,而无符号类型最好地反射(reflect)了这一点。不应使用 int 来测量长度。

但除此之外,您的所有三个解决方案都是相同的。 std::string::size_type 始终是 std::size_t,虽然我会使用 static_cast,但 C 风格的转换执行在这种情况下,相同的 Actor 。因为您知道返回的长度永远不会是负数(顺便说一句,请确保这一点;您永远不知道人们可能会做什么奇怪的事情),您只需转换类型就完全安全了:

return s2.size() > static_cast<std::size_t>(s1.GetLength());

如果 CString::GetLength 可以 为负数,出于某种原因,那么由您决定如何将负数转换为正数。截短?幅度(绝对值)?无论您需要什么。


如果您担心错误,要么进行显式检查并抛出异常(根据您的域,这可能代价太大),要么使用 assert。不过,一般来说,您应该相信文档。

关于c++ - 如何正确施法? (或者我应该这样做吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10025527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com