Bonjour.

Je cherche à modéliser une classe qui permettra à mon programme de tracer tout ce qu'il fait.

Je voudrais pouvoir m'en servir comme ça (en gros) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
LogsManager a;
a->log("Je commençe le programme"); // certains des logs sont statiques
a->log("Zut, j'ai un objet d'id " + id + " qui est négatif"); // mais pas tous
 
// on peut (doit) donner un type à un log
a->log("Je commençe à parser", LogsManager::Parsing);
 
// on peut même en donner plusieurs
std::list<LogsManager::LogsTypes> types;
types.push_back(LogsManager::Parsing);
types.push_back(LogsManager::StrangeData);
a->log("J'ai parsé la valeur " + val + " qui est supérieure à 100", types);
Dans cet exemple, je suppose quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
class LogsManager
{
public :
	...
 
public :
	enum LogsTypes
	{
		Parsing = 0,
		StrangeData,
		...
	}
	....
}
Ceci ne semble pas présenter de grandes difficultés.
Sauf que cela me chagrine que les types soient aussi dynamiques.

Cela va me donner derrière une fonction qui aura comme tête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
void LogsManager::log(const std::string& log, const std::list<LogsManager::LogsTypes>* types)
{
	if (types)
	{
		std::list<LogsManager::LogsTypes>::iterator it;
		for(it = types.begin(); it != types.end(); it++)
		{
			switch (*it)
			{
				case Parsing :
					...
					break;
				case StrangeData :
					...
					break;
				...
			}
		}
 
		....
	}
}
Et ça ce n'est pas très joli.
J'imagine qu'il existe une chouette solution pour faire cela statiquement, peut-être avec un genre de typelist, mais tout ce que je peux imaginer est terriblement compliqué.

Est-ce que quelqu'un saurait m'orienter vers une solution plus élégante ?

Merci par avance