Quand t'as par exemple ça :
Code:
struct ObjetQuiContientDesDonnees { ... };
void faireTrucA(ObjetQuiContientDesDonnees&);
void faireTrucB(ObjetQuiContientDesDonnees&);
T'es obligé d'appeler d'abord "faireTrucA" puis "faireTrucB" l'un après l'autre.
Si tu templatise ces deux fonctions, tu peux créer un objet "ObjetQuiContientDesDonnesTransaction" ou bien un objet "TransformateurDappelsDeFonctionsEnListeDeMessages " ou bien un "ObjetQuiContientDesDonnesMaisAvecUnMutexDevantCha queAppel", passer cet objet à faireTrucA et faireTrucB, et donc paralléliser les appels.
Tu peux déjà faire ça actuellement en passant directement un objet intermediaire plutôt qu'utiliser un template, mais ça fait une perte de performance si tu veux appeler l'une des ces fonctions en single-threaded.
Tu me diras qu'avec de l'héritage c'est déjà possible, mais il y a pas mal de trucs très pratiques (les itérateurs, les callbacks, etc.) qui sont soit inutilisables soit font perdre beaucoup de perfs.
---------- Post added at 09h49 ---------- Previous post was at 08h57 ----------
D'ailleurs j'attends toujours la solution du GotW 96 à ce sujet :
http://herbsutter.com/2014/01/14/gotw-96-oversharing/
Je pense qu'il va dire un truc similaire à moi pour la question #3
Et sinon je déteste la programmation fonctionnelle