Переменное количество аргументов в C ++? - PullRequest
237 голосов
/ 01 ноября 2009

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

Ответы [ 15 ]

2 голосов
/ 01 ноября 2009

Если вы знаете диапазон количества аргументов, которые будут предоставлены, вы всегда можете использовать некоторую перегрузку функций, например

f(int a)
    {int res=a; return res;}
f(int a, int b)
    {int res=a+b; return res;}

и так далее ...

2 голосов
/ 01 ноября 2009

Как уже говорили другие, C-style varargs. Но вы также можете сделать нечто подобное с параметрами по умолчанию.

1 голос
/ 24 октября 2018

Использование шаблонов переменных, пример для воспроизведения console.log, как видно в JavaScript:

Console console;
console.log("bunch", "of", "arguments");
console.warn("or some numbers:", 1, 2, 3);
console.error("just a prank", "bro");

Имя файла, например js_console.h

#include <iostream>
#include <utility>

class Console {
protected:
    template <typename T>
    void log_argument(T t) {
        std::cout << t << " ";
    }
public:
    template <typename... Args>
    void log(Args&&... args) {
        int dummy[] = { 0, ((void) log_argument(std::forward<Args>(args)),0)... };
        cout << endl;
    }

    template <typename... Args>
    void warn(Args&&... args) {
        cout << "WARNING: ";
        int dummy[] = { 0, ((void) log_argument(std::forward<Args>(args)),0)... };
        cout << endl;
    }

    template <typename... Args>
    void error(Args&&... args) {
        cout << "ERROR: ";
        int dummy[] = { 0, ((void) log_argument(std::forward<Args>(args)),0)... };
        cout << endl;
    }
};
1 голос
/ 26 октября 2017
int fun(int n_args, ...) {
   int *p = &n_args; 
   int s = sizeof(int);
   p += s + s - 1;
   for(int i = 0; i < n_args; i++) {
     printf("A1 %d!\n", *p);
     p += 2;
   }
}

Обычная версия

0 голосов
/ 01 февраля 2013

Мы также могли бы использовать initializer_list, если все аргументы являются константными и одного типа

...