如果没有像C#那样传递任何内容,则C ++将函数参数设置为null

时间:2014-01-22 21:54:18

标签: c++ default-value

我正在尝试用C ++创建一个函数,它接受3个参数,但第3个参数我想不允许传递任何内容。

例如 我该如何编写这个C#函数

public void GatherMovements( bool xPositions, bool yPositions, bool zPositions = null )

如何在C ++中创建它?有办法吗?

4 个答案:

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

如果一个函数可以相互实现,则可以调用另一个函数。

只有在使用truefalse调用函数时才需要第二种方法,并且没有最终参数是根本不同的操作。

如果你真的只想要一个功能而且这三个案例应该被认为是不同的,那么最后一个选择就是使用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作为默认值。