Передача в конструктор класса неограниченное количество аргументов

возникла проблема с тем, чтобы передать в конструктор класса заранее неизвестное количество аргументов. Я нашёл два возможных варианта решения

  1. (менее надёжный) это создать указатель на последний аргумент и использовать инкременты, так как обычно аргументы лежат в памяти друг за другом, но метод, кажется мне не надёжным и появляется проблема отличить последний введённый аргумент от мусора
Vector(int arg, ...)
{
    int *p = &arg;
}
  1. Использовать стандартную библиотеку stdarg.h, что будет явно адекватнее, но я столкнулся с проблемой: не могу отличить, когда заканчиваются аргументы и начинается мусор:
#include <stdarg.h>

class Vector
{
public:
    Vector(int arg, ...)
    {
        va_list ap;
        va_start(ap, arg);

        std::cout << arg << std::endl;

        for (int i = 0; i = va_arg(ap, int);)
        {
            std::cout << i << std::endl;
        }

        va_end(ap);
    }

};

int main()
{
    Vector a(1, 2, 3);
    return 0;
}

Вот что он выводит

1
2
3
12914723
12914723
16404480
14088232
2058353509
14088244
2058350259
1000937776
31
14088272
14088272
2058359868
14088272
2058350259
1000937776
31
14088300
14088300
2058359868
12914723
19291320
2001875552
14088312
2058350259
1000937776

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

Vector a(3, 1, 2, 3);

Но я бы не был программистом, если бы не ленился каждый раз думать о том, сколько там будет параметров и что случится, если я осчетаюсь. Я придумал как можно это обойти, например использовать препроцессор по типу:

#define a(...) a(__VA_ARGS__, NULL)

На данном примере работает хорошо, но я так и не догадался как написать его, чтобы он работал для всех переменных, а не только для "а".

Буду очень благодарен за подсказку или за идею как обойти этот недочет. Заранее спасибо!


Ответы (0 шт):