Можно ли иметь переменное количество параметров для каждой функции без перегрузки?

Можно ли сделать так, чтобы вам не приходилось перегружать определение функции 3 раза, если вы хотите иметь возможность передавать от 1 до 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] и у меня есть логическое значение isalive в каждом экземпляре массива, который я хочу установить в true, если параметры вызываются в bossbattle()Так, например, будет 3 isalive = true если 3 параметра переданы в bossbattle() но только 1 установлен в true, если передан только 1 параметр.

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) {
    ...
}
Другие вопросы по тегам