问题描述
我正在编写一个带有 2 个参数的函数,第一个是标记为 [[maybe_unused]] 的整数类型,第二个是默认参数为 false 的布尔类型。
int preOrderTraversial([[maybe_unused]] int searchData,bool fordisplay = false)
这是函数声明。该函数用于二叉搜索树中的先序遍历。我想使用相同的功能来显示树并遍历它以搜索具有特定数据的节点。但一次只能解决两个问题中的一个。不是为了搜索和显示你看到的。
所以,显然,它适用于搜索部分,但是当我调用显示函数调用的函数时,它看起来像这样:
preOrderTraversal(true)
或
bool fordisplay = true;
preOrderTraversal(fordisplay);
现在编译器(即使参数 DECLARED 为 BOOL)仍将这个 bool 参数视为 int 并将其用于函数的 searchData(整数)参数而不是 fordisplay(bool)参数。
有没有办法强制或告诉编译器我正在尝试使用这两个参数中的哪一个?
解决方法
[[maybe_unused]]
表示函数体可以不使用它,但是函数的签名总是有它的。实际上事件布尔值的默认值不会修改函数的签名;因此,您的函数 总是 接受 2 个参数,第一个是整数,第二个是布尔值(如果您没有将其设置为默认值)。你最终打电话给:
bool forDisplay = true;
preOrderTraversal(/* integer searchData; bool geting casted to int */ forDisplay,false /* the forDisplay (2nd param) default value*/);
这不符合您的期望。
[编辑] 如何克服? 在 C++ 中没有使用命名参数的内置方法,但您可以使用辅助类来解决:
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();
这有点模仿命名参数功能。