使用整数 [[mayb_unused]] 宏和默认参数布尔类型参数调用函数

Calling a Function with integer [[mayb_unused]] macro and default argument boolean type parameter

我正在编写一个带有 2 个参数的函数,第一个是标记为 [[maybe_unused]] 的整数类型,第二个是带有默认参数 false 的布尔类型。

int preOrderTraversial([[maybe_unused]] int searchData, bool forDisplay = false)

这是函数声明。该函数用于二叉搜索树中的预序遍历。我想使用相同的功能来显示树并遍历它以搜索具有特定数据的节点。但一次只能解决两个问题中的一个。不是为了搜索和显示你看到的。

所以,很明显,它在搜索部分工作得很好,但是当我调用显示函数调用的函数时,它看起来像这样:

preOrderTraversal(true)

bool forDisplay = true;
preOrderTraversal(forDisplay);

现在编译器(即使参数声明为 BOOL)仍然将此 bool 参数视为 int 并将其用于函数的 searchData(整数)参数而不是 forDisplay(bool)参数。

有没有办法强制或告诉编译器我正在尝试使用这两个参数中的哪一个?

[[maybe_unused]]表示函数体可能用不到,但是函数的签名总是有的。实际上,布尔值的默认值不会修改函数的签名;因此,您的函数 always 有两个参数,第一个是整数,第二个是布尔值(如果您没有输入,可能会设置为默认值)。您最终调用了:

bool forDisplay = true;
preOrderTraversal(/* integer searchData; bool geting casted to int */ forDisplay,
                  false /* the forDisplay (2nd param) default value*/);

不符合您的期望。

[编辑] 如何克服? 在 C++ 中没有使用命名参数的内置方法,但您可以使用助手 class:

解决方法
struct PreOrderTraversal {
  bool _forDisplay = false;
  int _searchData = 0; /* FIXME What is the default here? */
  auto& forDisplay() { _forDisplay = true; return *this; }
  auto& searchData(int x) { _searchData = x; return *this; }

  void run() { if (_forDisplay) ;//do the right things
               else ;// use data

  }
};

然后您可以将其用于:

PreOrderTraversal().forDisplay().run();
PreOrderTraversal().searchData(123).run();

这有点模仿命名参数功能。