我正在尝试用C ++创建一个函数,它接受3个参数,但第3个参数我想不允许传递任何内容。
例如 我该如何编写这个C#函数
public void GatherMovements( bool xPositions, bool yPositions, bool zPositions = null )
如何在C ++中创建它?有办法吗?
答案 0 :(得分:3)
默认参数是可能的。这里的问题是bool
不能具有null
值。所以你有几种可能性。您可以为该参数指定一个有效bool
的默认值:
void GatherMovements(bool xPositions, bool yPositions, bool zPositions = false);
或者你可以有两个函数重载 - 一个带3个参数,一个带2:
void GatherMovements(bool xPositions, bool yPositions, bool zPositions);
void GatherMovements(bool xPositions, bool yPositions);
如果一个函数可以相互实现,则可以调用另一个函数。
只有在使用true
,false
调用函数时才需要第二种方法,并且没有最终参数是根本不同的操作。
如果你真的只想要一个功能而且这三个案例应该被认为是不同的,那么最后一个选择就是使用boost::optional
:
void GatherMovements(bool xPositions, bool yPositions, boost::optional<bool> zPositions);
但是,我建议使用重载方法(不处理额外的不必要类型)。
答案 1 :(得分:1)
默认参数需要在声明中列出(不是定义)。 所以,你的声明是:
public:
void GatherMovements(bool xPos, bool yPos, bool zPos = false);
你的定义是:
void MyClass::GatherMovements(bool xPos, bool yPos, bool zPos /* = false */) {}
此外,默认参数需要在此处按值传递,即您不能:
public:
void GatherMovements(bool xPos, bool yPos, bool& zPos = false);
答案 2 :(得分:0)
使用boost
或C ++ 1y建议std::optional
,您可以解决此问题。
void GatherMovements(bool xPos, bool yPos, boost::optional<bool> zPos = boost::nullopt);
在GatherMovements
的正文中,您可以通过zPos
判断if(zPos)
是否已通过。通过执行bool
,您可以获得zPos
*zPos
的{{1}}值。从某种意义上说,zPos
遵循C ++指针语义进行解除引用。
如果您取消引用zPos
而不检查它是否有效,则会出现未定义的行为。
很容易意外使用zPos
作为bool
,而不会意外取消引用它,所以要小心。
如果您不想使用C ++ 1y或boost
,另一个选择是选择bool const*
,并且过载:
void GatherMovements_Internal(bool xPos, bool yPos, bool const* zPos);
void GatherMovements(bool xPos, bool yPos, bool zPos) { GatherMovements_Internal(xPos, yPos, &zPos); }
void GatherMovements(bool xPos, bool yPos) { GatherMovements_Internal(xPos, yPos, nullptr); }
现在你写GatherMovements_Internal
,如果没有传递zPos
nullptr
,则指向传递的bool
。请注意,此指针的生命周期不能保证超过函数调用(因此不要存储指针)。
使用与上面optional
案例相同的逻辑(if (zPos)
来确定它是否存在,并使用*zPos
来获取值(如果存在)。
答案 3 :(得分:0)
如果已经使用提升/取决于它不会有问题,可以使用tribool::indeterminate_value作为默认值。