Как мне писать функции, которые принимают неограниченное количество аргументов?

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

#include <iostream>
#include <stdarg.h>

using namespace std;

void Print(int argumentAmount, ... );

int main()
{
    Print(5,11,22,33,44,55);
}

void Print(int argumentAmount, ... ){

    va_list arguments; 
    va_start(arguments, argumentAmount);

    int parameter;
    for(int i = 0; i < argumentAmount; ++i ){
        parameter = va_arg(arguments, int);
        cout << parameter << endl;
    }

    va_end(arguments);
    return;
}

2 Проблемы:
1.) Я должен указать, сколько аргументов я отправляю - нежелательно
2.) Я не могу понять, как чтобы изменить его так, чтобы он выводил строки.

Возможно ли что-то подобное без необходимости многократно перегружать функцию:

void Output(/*not sure how this would look*/);

int main(){

    Output("hello","world");
    Output("this","is","a","test");
    Output("As","many","strings","as","you","want","may","be","passed","in");

    return 0;
}
void Output(/*not sure how this would look*/){

    //loop through each string passed in and output it
}

Что насчет этого:

void Capitalize(/*all passed by reference*/);

int main(){

    string s1 = "hello";
    string s2 = "world";

    string s3 = "this";
    string s4 = "is";
    string s5 = "a";
    string s6 = "test";

    string s7 = "as";
    string s8 = "many";
    string s9 = "strings";
    string s10 = "as";
    string s11 = "you";
    string s12 = "want";

    Capitalize(s1,s2);
    Capitalize(s3,s4,s5,s6);
    Capitalize(s7,s8,s9,s10,s11,s12);

    return 0;
}
void Capitalize(/*all passed by reference*/){

    //capitalize each string passed in

}

Все, что я могу придумать, это:
-загрузить функцию несколько раз
-принять вместо этого какой-либо тип контейнера

Если это НЕВОЗМОЖНО , может ли кто-нибудь объяснить, почему компилятор не может выполнить такую ​​задачу.

18
задан Trevor Hickey 16 May 2016 в 19:46
поделиться