La classe Noisy ci-dessous est une technique recommandée par Stephan T. Lavavej pour détecter les opérations de la Sainte-Trinité dans un programme générique. Utiliser un Noisy en tant que type T produit une trace de chacune de ces opérations.
Elle peut se présenter comme suit (Stephan T. Lavavej remplace les écritures à travers std::cout par des appels à puts(), ce qui réduit les dépendances dans le code) :
#include <iostream>
using namespace std;
struct Noisy {
Noisy() { cout << "Noisy::Noisy()" << endl; }
Noisy(const Noisy&) { cout << "Noisy::Noisy(const Noisy&)" << endl; }
Noisy(Noisy&&) { cout << "Noisy::Noisy(Noisy&&)" << endl; }
Noisy& operator=(const Noisy&) {
cout << "Noisy::operator=(const Noisy&)" << endl; return *this;
}
Noisy& operator=(Noisy&&) {
cout << "Noisy::operator=(Noisy&&)" << endl; return *this;
}
~Noisy() { cout << "Noisy::~Noisy()" << endl; }
};
C'est un bon truc pour déboguer le code générique et comprendre les différences entre diverses écritures. Par exemple :
... en exécutant les programmes proposés à droite, qui se ressemblent beaucoup en surface... |
|
|
|
|
... on aura à l'exécution les affichages suivants : |
|
|
|
|
C'est, en soi, instructif.