С++ вызывает конструктор суперкласса с va_arg

У меня есть базовый класс, который включает в себя конструктор с переменным списком аргументов:

class Super {
public:
    Super(int num, ...);
...
}

Теперь в моем конструкторе подкласса мне нужно как-то вызвать этот конструктор суперкласса, но как мне это сделать? Обычное дело, естественно, не работает:

class Sub {
public:
    Sub(int num, ...) : Super(???) { ... }
...
}

Так что же мне поставить вместо ???

У меня есть еще один конструктор, который принимает вектор, но такой конструктор является прямым требованием клиента.


person Aleks G    schedule 06.07.2015    source источник
comment
Вместо этого вы можете использовать вариативные шаблоны.   -  person Barry    schedule 06.07.2015
comment
Я с @Барри. Вероятно, вам никогда не следует использовать переменные аргументы в стиле C.   -  person RamblingMad    schedule 06.07.2015


Ответы (1)


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

void foo(int a, ...) { va_list ap; va_start(ap, a); vfoo(a, ap); va_end(ap); }

void vfoo(int a, va_list ap) { /* actual implementation */ }

То же самое:

#include <cstdarg>

struct Super
{
    Super(int num, ...) : Super(num, (va_start(ap_, num), ap_)) { va_end(ap_); }
    Super(int num, va_list ap);

private:
    va_list ap_;
};

Ваши производные классы будут выполнять ту же гимнастику vapacking, а затем использовать форму списка суперконструктора.

Если наличие члена данных только для целей конструирования вас расстраивает, а ваш класс иначе можно копировать или перемещать, вы также можете отказаться от конструктора переменных и вместо этого иметь именованную статическую функцию-член, которая выполняет перенос пакета.

person Kerrek SB    schedule 06.07.2015
comment
Хороший; есть ли подход, который не включает члена va_list? - person Jason C; 22.08.2016