1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
template <class Container>
struct hard_kill
{
stattic void kill(Container& container)
{
// Vide véritablement le container. Violent, et quelque fois nécessaire.
Container().swap(container);
}
};
template <class Container>
struct soft_kill
{
stattic void kill(Container& container)
{
// a de bonne chance de ne pas changer la capacité du conteneur,
// dans les cas ou c'est souhaitable (ex: std::vector qui peut être
// réutilisé par la suite).
container.clear();
}
};
// On peut prévoir d'autres policies, y compris une policy qui ne fait rien
// ou rempli le vecteur avec des valeurs par défaut :
// template <class Container>
// struct fill_with_default
// {
// static void kill(Container& container)
// {
// typedef typename Container::value_type value_type;
// std::fill(container.begin(), container.end(), value_type());
// }
// };
// Je ne sais pas trop à quoi ça peut servir, mais bon :)
// Par défaut, la stratégie de vidage effectue une opération qui ne désaloue
// pas nécessairement la mémoire allouée par le conteneur. Utile si le
// conteneur est réutilisé dans des conditions similaire
template <class Container, class KillPolicy = soft_kill>
void raz(Container& container)
{
// un type alias, pour simplifier l'écriture de la ligne suivante
// le typename ici est nécessaire.
typedef typename Container::value_type value_type;
// la version de clear_content() appelée dépends du type value_type.
// si c'est un type pointeur, alors la seconde version sera appelée et
// les objets seront détruit. Dans le cas contraire, la première version
// sera appelée, rien ne se passera (le compilateur va détecter que rien
// ne se passe, et optimisera le code en fonction).
clear_content(container, value_type());
// Maintenant, on peut vider le conteneur.
// ANCIEN CODE : Container().swap(container);
// NOUVEAU CODE : histoire d'avoir le choix sur la méthode de vidage.
KillPolicy::kill(container);
} |
Partager