将bool变量作为参数传递的更好方法是什么?

时间:2015-09-23 15:50:38

标签: c++ readability

我想知道是否有更好的方法来编写它以提高可读性。 如果您有如下功能,

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);

有没有更好更短的方式?

8 个答案:

答案 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