Il est temps que je donne un peu plus d'informations, d'autant que j'ai dû affiner mon problème (merci koala).
L'application qui doit utiliser le Logger est une application serveur, donc j'ai besoin de performances particulièrement rapides.
Mais en parallèle, j'ai besoin de pouvoir consulter les logs en même temps que le serveur tourne, afin de ne pas avoir besoin de l'éteindre ou quoi que ce soit de ce genre pour pouvoir consulter des informations critiques.
La particularité de mon Logger et de LogLevel, c'est que certains niveaux sont logués dans un fichier (et dossier) spécifique jour après jour, tandis que d'autres sont logués dans un unique fichier qui ne change pas.
En plus de ça, j'affiche des informations directement dans la console pour lorsque je debug en direct avec le client.
Cela veut dire que plusieurs niveaux peuvent avoir besoin d'un même fichier, ou pas.
Donc il va falloir non pas que j'intègre l'ofstream directement dans LogLevel, mais plutôt que j'y mette une référence.
@Ekleog > J'avais fait en sorte d'afficher quelque chose dans le destructeur de LogLevel, et à l'exécution je voyais bien que lorsque j'exécutais :
Le destructeur était appelé, et par conséquent quand l'objet dans ma map était détruit à la sortie du scope, j'avais un crash car deux destructions d'ofstream sur le même fichier.Code:logger.register_level ("truc", LogLevel(/* ... */));
Pour ce qui est des unique_ptr, je suis presque sûr de mal m'y prendre puisque ça ne marche pas mais que mon <bits/unique_ptr.h> contient bien :
J'ai essayé avec une petit structure ne contenant qu'un seul unique_ptr de le rentrer dans une map, mais je ne sais pas quel prototype donner à ma fonction pour que le move soit appelé (à chaque fois il me dit que j'ai pas de constructeur/operateur de copie parce que sinon il serait malformé ...).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 // Assignment. unique_ptr& operator=(unique_ptr&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward<deleter_type>(__u.get_deleter()); return *this; } template<typename _Up, typename _Ep, typename = typename std::enable_if <std::is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && !std::is_array<_Up>::value>::type> unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward<_Ep>(__u.get_deleter()); return *this; }