2016-10-12 2 views
0

Возможно ли в C++ передать переменные аргументы в базовый конструктор?Передать переменный аргумент в базовый конструктор в C++

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

Это то, что я пытался до сих пор:

class A{ 
public: 
    A(const char * fmt,...){ 
    va_list ap; 
    va_start(ap, fmt); 
    vprintf(fmt,ap); 
    va_end(ap); 
    }; 
}; 

class B: public A{ 
public: 
    B(const char * fmt,...):A(fmt){;}; 
}; 

int main(){ 
    B("%d\n",42); 
} 

Но конструктор не передает переменные аргументы в конструктор базового класса.

+0

Связанных, вы пробовали использовали C++ VARIADIC аргументов шаблона вместо старая школа va_stuff? – WhozCraig

+0

Для C-эллипса у вас есть вариант передать 'va_list', поскольку' printf' имеет экземпляр 'vprintf'. Для C++ просто используйте вариационный шаблон. – Jarod42

ответ

5

Просто используйте VARIADIC шаблоны (и падение этого материала C-стиль):

struct A { 
    template<typename ... Args> 
    A(const char * fmt, Args&& ... args) { 
      printf(fmt,std::forward<Args>(args) ...); 
    }; 
}; 

struct B: public A { 
    template<typename ... Args> 
    B(const char * fmt, Args&& ... args) : A(fmt, std::forward<Args>(args) ...) {} 
}; 

Пример:

B("Print %d and %s",1,"hello"); //prints "Print 1 and hello" 

DEMO

+0

Я просил список переменных аргументов, так как я хочу использовать printf. Я знаю, что можно реализовать функцию printf, подобную функции (с типами) в C++, используя вариативные шаблоны, но я не нашел один ... – user3384414

+0

Извините, я должен был добавить это ... Я делаю это прямо сейчас. .. сделанный :-) – davidhigh

Смежные вопросы