我想知道是否有更好的方法来编写它以提高可读性。 如果您有如下功能,
void animal(bool hasFourLegs, bool hasHead, bool hasBody);
当你调用这个函数时,你最终会得到像
这样的东西animal(true, false, true);
这让我每次遇到这样的函数时都会看一下这个定义。
... SO
我做这样的事情!
const bool HAS_FOURLEGS = true;
const bool NO_HEAD = false;
const bool HAS_BODY = true;
animal(HAS_FOURLEGS, NO_HEAD, HAS_BODY);
但是每次调用函数时我都不想声明const bool
。
似乎CPP不支持像
这样的东西animal(bool hasFourlegs = true, bool hasHead = false, bool hasBody = true);
有没有更好更短的方式?
答案 0 :(得分:10)
当我遇到与此相关的问题时,即使只有2个预期的选择,我有时会创建enum
:
例如,而不是以下函数声明:
bool search(..., bool resursive);
我会选择:
enum class SearchOpt
{
Recursive,
NonRecursive
};
bool search(..., SearchOpt opt);
因此,调用语法从:
更改bool found = search(..., true);
为:
bool found = search(..., SearchOpt::Recursive);
注意:这可以避免每次调用函数时都必须创建自己的常量。
正如其他人所建议的那样,不是为每个选项单独bool
,而是为每个选项单独enum
,而将单个enum
配置为位标志是有意义的。
答案 1 :(得分:8)
使用标志:
enum {
HAS_LEGS = 0x01,
HAS_HEAD = 0x02,
HAS_BODY = 0x04,
};
void animal(int properties);
animal(HAS_LEGS | HAS_HEAD);
答案 2 :(得分:2)
另一个选择是使用一个类来保存他们密切相关的参数:
struct AnimalOptions {
bool hasHead, hasBody, hasLegs;
AnimalOptions() : hasHead(false), hasBody(false), hasLegs(false);
}
...
AnimalOptions opt;
opt.hasHead = true;
animal(opt);
这种技术非常有用,只要你有一个函数,它似乎采用了相同类型的一堆参数,其顺序不容易被记住。当您的函数需要多个int
时,它同样有用。
答案 3 :(得分:2)
奇怪没有人建议Boost.parameter中的命名参数:http://www.boost.org/doc/libs/1_59_0/libs/parameter/doc/html/index.html
答案 4 :(得分:2)
作为其他答案的替代方案,我喜欢tagged_bool在他的博客上提出的Andrzej Krzemieński。
答案 5 :(得分:0)
评论是你的朋友!
animal( true, //hasFourLegs
false, //hasHead
true //hasBody
);
答案 6 :(得分:0)
您可以使用按位值,如下所示:
const int hasLegs = 0x01;
const int noHead = 0x02;
const int hasBody = 0x04;
然后使用上述任意组合调用animal
,例如:
动物(hasLegs + hasBody);
使用单个animal
参数进行Decalre int
。
inside `animal`, test the bits:
if (parameter & haasBody)
{
// it has a body....
}
答案 7 :(得分:0)
C++20 将 designated initializers 作为聚合初始化的一部分。您可以使用布尔参数创建一个结构并按值传递该结构。您甚至可以拥有默认参数值。
struct AnimalParts {
bool hasFourLegs = false;
bool hasHead = true;
bool hasBody = true;
}
void animal(AnimalParts parts);
然后像这样使用它:
animal({.hasFourLegs = true, .hasHead = false});
这与您建议的命名参数习语非常接近。在编译方面,这两个选项似乎都能产生类似的输出,参见 Godbolt。