2

Having Ich versuche, eine generische Funktion für die Anmeldung ein paar Sachen für das Debuggen zu schreiben, und ich möchte, wie so es beispielsweise nennen:Probleme mit C++ variadische Template-Parameter

Log("auo", 34); //writes: auo34 

Point point; 
point.X = 10; 
point.Y = 15; 
Log(35, point, 10); //writes: 35{10, 15}10 

Aber ich habe alle möglichen Probleme mit dem Packen und Entpacken der Parameter, ich kann nicht den Dreh raus bekommen. Unten ist der vollständige Code:

struct Point { 
    long X, Y; 
} 

std::ofstream debugStream; 

template<typename ...Rest> 
void Log(Point first, Rest... params) { //specialised for Point 
    if (!debugStream.is_open()) 
     debugStream.open("bla.log", ios::out | ios::app); 
    debugStream << "{" << first.X << ", " << first.Y << "}"; 
    Log(params...); 
} 

template<typename First, typename ...Rest> 
void Log(First first, Rest... params) { //generic 
    if (!debugStream.is_open()) 
     debugStream.open("bla.log", ios::out | ios::app); 
    debugStream << first; 
    Log(params...); 
} 

Wie kann ich die Funktionen bitte reparieren?

+2

Sie müssen einen Basisfall für den letzten rekursiven Aufruf bereitstellen, wenn das Parameterpaket leer ist und ein Aufruf von 'Log()' ausgewertet wird. Hinzufügen einer 'void Log() {}' Überladung sollte ausreichen. – DeiDei

Antwort

4

Nehmen Sie die folgende vereinfachte Version:

void print() {} 

template<typename First, typename... Rest> 
void print(const First& first, const Rest&... rest) 
{ 
    std::cout << first; 
    print(rest...); 
} 

Wenn sizeof...(Rest) == 0 ein Aufruf an print() ohne Parameter ausgegeben werden, die den Basisfall Überlastung oben erfordert.

Verwandte Themen