2

Je suis en train d'écrire une fonction générique pour connecter des trucs pour le débogage, et je veux l'appeler par exemple comme ceci:problèmes avec C++ paramètres du modèle variadique

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

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

Cependant, je vais avoir toutes sortes de problèmes avec l'emballage des paramètres et le déballage, je ne peux pas sembler avoir compris. Voici le code complet:

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

Comment réparer les fonctions?

+2

Vous devez fournir un cas de base pour le dernier appel récursif lorsque le pack de paramètres sera vide et qu'un appel à 'Log()' sera évalué. L'ajout d'une surcharge «void Log() {}» devrait suffire. – DeiDei

Répondre

4

Prenez la version simplifiée suivante:

void print() {} 

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

Lorsque sizeof...(Rest) == 0 un appel à print() avec aucun paramètre ne sera émis ce qui nécessite la surcharge de cas de base ci-dessus.