【问题标题】:Is it possible to have a variable number of parameters per function without overloading?是否可以在不重载的情况下为每个函数设置可变数量的参数?
【发布时间】:2013-10-19 23:32:52
【问题描述】:

如果您希望能够向其中传递 1 到 3 个参数,是否可以使您不必重载函数定义 3 次?

例如代替:

function(class a) { //this is called if only 1 class is passed
instance 1 = a;
} 
function(class a, class b) {  //this is called if 2 classes are passed
instance1 = a;
instance2 = b;
}
function(class a, class b, class c) { //this is called if 3 classes are passed
instance1 = a;
instance2 = b;
instance3 = c;
}

你可以:

function(class a, <if2class>class b, <if3class>class c) //this is called
                                                        //for all passes
// <ifxclass> is not a real command, I'm using it for demonstration
{
    instance1 = a; //always
    instance2 = b; //if class b is passed
    instance3 = c; //if class c is passed
}

对于函数调用...

function(first, second) //example of a function call with this code

编辑:实际用途的解释:

bossbattle(biglion, bigtiger);
bossbattle(biglion);
bossbattle(hades, biglion, biglion);
//where inside bossbattle it sets the classes passed in to temporary classes
//for battle. that's why I need a variable number of parameters

我已经为普通敌人创建了一个战斗系统,它调用了一个函数,根据随机普通敌人的分层百分比随机填充 1-3 个点。我正在尝试使用相同的战斗系统但具有不同的功能(即boss battle())来填充与老板战斗的战斗系统。临时敌人用于战斗的类实例位于名为 Enemy battlefield monsters[3] 的数组中,如果在 bossbattle() 中调用参数,我希望在数组的每个实例中将其设置为 true 的布尔值 isalive 例如,如果有 3 个参数传递给 bossbattle(),则将有 3 个 isalive = true,但如果只传递 1 个参数,则只有 1 个设置为 true。

【问题讨论】:

  • 带默认参数的函数?
  • 请发一个真实的使用情况。根据零对多规则,你一开始就不应该有像“instance2”和“instance3”这​​样的东西。
  • 看看像 printf 这样的函数是如何工作的。我相信有一个类似于...的运算符。我已经在定义中看到了这个,即。 printf(char *format, ...),但我根本没有调查过。
  • @Shade:这被称为variadic function,但在这种情况下这不起作用,除非a 的值(或其他始终可访问的变量)可用于确定有多少参数已通过。
  • 您想要“代替”代码的代码无法编译。您可能认为这并不重要,但它使您的问题变得荒谬,因为您似乎在询问如何将类传递给函数,这在 C++ 中是不可能的。如果您要询问代码,请询问可编译的代码。然后,回答者可以知道他们的回答确实取代了你所拥有的,而不是根据你可能的意思最有可能的合理想法进行猜测。

标签: c++ function c++11 parameters optional-parameters


【解决方案1】:

使用默认参数来实现这一点。比如:

void foo(int arg, int arg2 = 0, int arg3 = 0) {
    ...
}

它允许您调用foo 并向其传递 1、2 或 3 个参数。


既然您提到了您的实际意图:即调用“bossbattle(hades, biglion, biglion);bossbattle 内部,它将传入的类设置为用于战斗的临时类”

如果这个bossbattle 受限于(我们称之为)战斗参与者的数量(即总是会有 1 到 3 个参与者),那么您可以使用上述方法。否则,定义一个提取任何“hades”、“lion”和“tiger”的共同点来定义基类的类可能更合理,比如说class Creature,并更改接口以取而代之的是一个生物容器:

void bossbattle(const std::vector<Creature>& battleParticipants) {
    ...
}

【讨论】:

  • 我需要在函数定义中使用相当多的 if 语句吗?我正在寻找更精简的东西,例如 --> (class a, $class b, $class c) 以便编译器知道可能没有传递参数,如果没有,请不要担心。 --> $ 是组成的条件运算符。看看我在 Kerrek SB 的问题中添加的真实示例吧?
  • 在阅读了所有提供的示例之后,我认为默认参数是最有效的方法。其他一切都没有真正做我需要做的事情。谢谢!
  • @Scott:我很高兴我以某种方式提供了帮助 :)
猜你喜欢
  • 2020-05-01
  • 2019-12-08
  • 2017-03-13
  • 2016-05-24
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多