c++ извикващ конструктор на суперклас с 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
Аз съм с @Barry. Вероятно никога не трябва да използвате променливи аргументи в стил 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