2016-10-12 1 views
0

Ist es in C++ möglich, Variablenlisten an einen Basiskonstruktor zu übergeben?Variable Argumentliste an Basiskonstruktor in C++ übergeben

Ich könnte nur den Code des Basiskonstruktors in die abgeleitete Klasse kopieren, ein Handle der Variablen Argumentliste dort, aber das würde zu unerwünschten Code-Duplikation führen. Diese

ist, was ich versucht, so weit:

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); 
} 

Aber der Konstruktor nicht die variablen Argumente an die Basisklassenkonstruktor.

+0

Verwandte, haben Sie versucht, verwendet C++ variadische Vorlage Argumente statt Oldschool va_stuff? – WhozCraig

+0

Für C-Ellipsen haben Sie eine Variante, 'va_list' zu übergeben, da' printf' das Gegenstück 'vprintf' ist. Für C++ verwenden Sie einfach variadic Vorlage. – Jarod42

Antwort

5

Verwenden Sie einfach variadische Vorlagen (und fallen diese C-Stil Zeug):

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) ...) {} 
}; 

Beispiel:

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

DEMO

+0

Ich fragte nach Variablenargumenten Listen, wie ich printf verwenden möchte. Ich weiß, dass es möglich ist, eine printf-ähnliche Funktion (mit typesafety) in C++ mit variadischen Vorlagen zu implementieren, aber ich habe keine gefunden ... – user3384414

+0

Entschuldigung, ich hätte hinzufügen sollen ... Ich mache es gerade jetzt. .. erledigt :-) – davidhigh

Verwandte Themen