IE盒子

搜索
查看: 211|回复: 20

译 | 别在 C++ 函数形参里用 bool 了!

[复制链接]

3

主题

5

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-9-24 04:27:17 | 显示全部楼层 |阅读模式
原文:STOP USING BOOL IN C++ FOR FUNCTION PARAMETERS !
<hr/>介绍

本文讨论了 bool 在 C++ 中的使用。我们该不该用它?这就是我们要回答的问题。虽然这更像是一个开放的讨论,而不是一个编码规则。
首先,bool 类型是什么?布尔变量是一个可以设置为 false 或 true 的变量。
假设你有一个简单的功能来决定是否要买房子,你可以这样设计
bool shouldBuyHouse(bool hasSwimmingPool, bool hasEconomicLight);
问题来了!

然后,你想用它的时候,可以这么用:
if(shouldBuyHouse(false, true)){}
这里用的没有问题,但是读者第一眼可能不明白这个 false 是指没有游泳池,还是说没有节能灯。
因此,你试着把函数调用改成了这样:
bool economicLight = true;
bool hasSwimmingPool = false;

if(shouldBuyHouse(economicLight, hasSwimmingPool)) {

}
现在你高兴了,读者确切地知道 bool 的意思了。你确定?眼尖的读者可能会注意到,这里的参数颠倒了。
怎么解决问题?

有不同的方法来解决这类问题。第一种方法是使用 strong_type。有许多库提供这类功能,但是,一个简单的 enum class就可以做到这一点。
读者不仅会知道哪个实参对应哪个形参,而且在形参颠倒的情况下,编译器也不会让错误通过。
让我们重写函数声明:
enum class HouseWithSwimmingPool {No, Yes};
enum class HouseWithLights {Economical, Incandescent};

bool shouldBuyHouse(HouseWithSwimmingPool, HouseWithLights);

if(shouldBuyHouse(HouseWithSwimmingPool::Yes, HouseWithLights::Economical)) {

}
结语

我建议大家不要在函数形参中使用 bool 类型。你怎么看?你是否在哪都使用 bool?
Thanks for reading~
回复

使用道具 举报

2

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-24 04:27:27 | 显示全部楼层
虽然在C++ core guidelines里看到过这个条款,但是一直不太明白和bool有什么关系,如果是两个连续的int参数不是也有可能会写反吗?就算改成enum,连续两个同类型的enum不也有可能写反吗?
要完全解决这个问题,可以在有很多同类型参数时,用一个结构体参数代替,其成员名可以明确每个参数具体含义(如果不嫌麻烦的话)。
回复

使用道具 举报

2

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-24 04:28:24 | 显示全部楼层
不如开个参数名提示[惊喜]
回复

使用道具 举报

4

主题

10

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2022-9-24 04:29:16 | 显示全部楼层
按你的意思,int也不能用了。if (shouldBuyHouse(100, 300)) {} 100平300万[尴尬]
回复

使用道具 举报

2

主题

13

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2022-9-24 04:29:47 | 显示全部楼层
chrono就是这么干的……
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-9-24 04:30:21 | 显示全部楼层
虽然但是,我只是翻译一下[害羞]对线也可以去 https://cpp-rendering.io/using-bool-in-c/ 原文下面 Reply
回复

使用道具 举报

3

主题

11

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-9-24 04:30:31 | 显示全部楼层
要这么说Python的关键字参数才是正确的方向啊。
回复

使用道具 举报

2

主题

6

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-9-24 04:30:52 | 显示全部楼层
没用过带inlay text的IDE吗……形参名字有提示[doge]
回复

使用道具 举报

2

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-9-24 04:31:36 | 显示全部楼层
bool的确很鸡肋,所有的bool慢慢的都需要变成int
回复

使用道具 举报

1

主题

9

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-9-24 04:31:52 | 显示全部楼层
但是enum class写起来太长了,这是原罪。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表