是否有可能在不超载的情况下为每个函数设置可变数量的参数?

问题描述:

如果你想能够在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]一个数组,我有,我想设置为true,如果参数被称为bossbattle() 因此,例如,将有数组的每个实例的布尔如果有3个参数传入bossbattle(),但只有1个设置为true,如果只传递1个参数。

+5

使用默认参数的功能? – billz

+1

请发布一个真实的使用情况。根据零一条规则,你永远不应该有像“instance2”和“instance3”这​​样的东西。 –

+0

看看printf如何工作。我相信有一个类似于'...'的操作符。我见过这个在定义中使用,即。 'printf(char *格式,...)',但我还没有看过它。 – Shade

使用默认参数来实现此目的。喜欢的东西:

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) { 
    ... 
} 
+0

我是否需要在函数定义中使用不少if语句?我正在寻找一些更加简化的东西,比如 - >(class a,$ class b,$ class c),所以编译器知道可能参数没有通过,如果没有的话就不用担心。 - > $是构成的条件运算符。看看我为Kerrek SB添加了问题的真实例子吧? – Scott

+0

@Scott:看我的编辑(在线下)。 – LihO

+0

在阅读了所有提供的示例之后,我总结出默认参数是最有效的方法。其他一切都没有真正做我需要做的事情。谢谢! – Scott