Il y a six ans, Facebook a publié sa bibliothèque C++ nommée Folly, une vaste collection de composants de bibliothèque C++ réutilisables, massivement utilisés en interne chez Facebook.
Mais de nombreuses bibliothèques C++ open source matures existent déjà, alors pourquoi en introduire une autre ? Voici les motivations de sa création, telles qu'expliquées sur leur site web :
Folly (acronyme approximatif de Facebook Open Source Library) est une bibliothèque de composants C++11 conçue dans un souci de praticité et d'efficacité. Elle complète (plutôt qu'elle ne concurrence) des offres telles que Boost et bien sûr std. En fait, nous ne nous lançons dans la définition de notre propre composant que lorsque quelque chose dont nous avons besoin n'est pas disponible, ou ne répond pas au profil de performances requis.Voici, par exemple, une explication détaillée des raisons pour lesquelles Folly a introduit une autre classe de vecteur, FBVector. Comme l'affirment les développeurs de Folly, c'est une bibliothèque de composants C++11 — une affirmation pleinement confirmée par un regard sur le code source : les fonctionnalités de C++11 sont massivement utilisées, et de surcroît, presque toutes les nouvelles fonctionnalités de C++11 le sont.
Lorsque C++0x a été annoncé il y a quelques années, je pensais qu'il n'aurait pas beaucoup d'impact sur le langage C++, mais je me trompais. Regardez cet extrait de code issu de Folly — on dirait qu'il a été développé avec un nouveau langage.

La même observation vaut pour la quasi-totalité du code source de Folly ; son implémentation semble différente du code source C++03.
Pour les développeurs souhaitant maîtriser les nouvelles fonctionnalités de C++11, l'une des meilleures approches consiste à voir comment les bibliothèques matures les utilisent. Folly est un très bon candidat pour explorer ces nouvelles fonctionnalités. Explorons-en quelques-unes dans son code source.
1. auto
C++11 introduit l'inférence de type via le mot-clé auto, ce qui signifie que le compilateur déduit le type d'une variable au point de déclaration. Folly utilise auto pour la quasi-totalité de ses déclarations de variables ; en voici un exemple tiré de son code source.

Utiliser le mot-clé auto vous fait gagner du temps en évitant d'écrire explicitement des types que le compilateur connaît déjà.
2. nullptr
La constante 0 a traditionnellement joué le double rôle de constante entière et de constante de pointeur nul. C++11 corrige cela en introduisant un nouveau mot-clé servant de constante de pointeur nul distincte : nullptr.
Dans le code source de Folly, tous les pointeurs nuls sont représentés par le nouveau mot-clé nullptr ; la constante 0 n'est utilisée nulle part.
3. shared_ptr
Les smart pointers ne sont pas un concept nouveau ; de nombreuses bibliothèques les ont implémentés il y a des années, la plus populaire étant boost::shared_ptr. Ce qui est nouveau, c'est leur standardisation — il n'est plus nécessaire d'utiliser une bibliothèque externe pour travailler avec les smart pointers.
Folly utilise massivement le pointeur partagé standardisé ; il ne reste que quelques pointeurs bruts dans son code source.
4. Les énumérations fortement typées
Les énumérations « traditionnelles » du C++ exportent leurs énumérateurs dans la portée environnante, ce qui peut entraîner des collisions de noms si deux énumérations différentes dans la même portée définissent des énumérateurs portant le même nom. C++11 introduit les énumérations à portée limitée grâce à la syntaxe enum class. Elles n'exportent plus leurs énumérateurs dans la portée environnante. De plus, nous pouvons désormais spécifier le type sous-jacent d'une énumération.

5. static_assert
C++11 introduit une nouvelle façon de tester des assertions au moment de la compilation, grâce au nouveau mot-clé static_assert. Cette fonctionnalité est très utile pour ajouter des conditions aux paramètres de templates, comme le montre cette classe template issue du code source de Folly :

6. Les templates variadiques
Un template variadique est un template pouvant accepter un nombre arbitraire d'arguments template de n'importe quel type. Les classes comme les fonctions peuvent être variadiques. Folly définit de nombreux templates variadiques ; voici deux fonctions templates variadiques issues de son code source :

7. Les boucles for basées sur des intervalles
C++11 étend l'instruction for avec l'itération basée sur des intervalles sur les collections. Cela rend le code plus simple et plus propre. Folly utilise abondamment cette fonctionnalité ; en voici un exemple tiré de Folly.

8. Les listes d'initialisation
En C++03, les listes d'initialisation ne s'appliquent qu'aux tableaux ; en C++11, elles ne sont plus limitées aux tableaux. Le mécanisme permettant d'accepter une liste {}est une fonction (souvent un constructeur) acceptant un argument de type std::initializer_list<T>. Voici un exemple de fonction acceptant un std::initializer_list comme argument.

Et voici comment elle est invoquée.

9. noexcept
Si une fonction ne peut pas lever d'exception, ou si le programme n'est pas écrit pour gérer les exceptions levées par une fonction, celle-ci peut être déclarée noexcept.
En voici un exemple tiré du code source de Folly.

10. move
C++11 a introduit le concept de références rvalue (spécifiées avec &&) pour distinguer une référence à une lvalue d'une référence à une rvalue. Une lvalue est un objet qui a un nom, tandis qu'une rvalue est un objet qui n'a pas de nom (un objet temporaire). La sémantique de déplacement permet de modifier les rvalues. Pour la prendre en charge, C++11 introduit deux nouvelles fonctions membres spéciales : le constructeur de déplacement et l' opérateur d'affectation par déplacement.


Voici un bon document qui explique mieux les avantages de la sémantique de déplacement.
11. Les lambdas
C++11 offre la possibilité de créer des fonctions anonymes, appelées fonctions lambda. Vous pouvez consulter ici pour plus de détails sur cette nouvelle fonctionnalité.
Folly les utilise dans de nombreuses fonctions ; en voici un exemple tiré de son code source :

12. Les fonctions membres spéciales explicitement définies par défaut ou supprimées
En C++03, le compilateur fournit, pour les classes qui ne les définissent pas elles-mêmes, un constructeur par défaut, un constructeur de copie, un opérateur d'affectation par copie (operator=) et un destructeur. Le programmeur peut remplacer ces versions par défaut en définissant des versions personnalisées. Cependant, on a très peu de contrôle sur la création de ces versions par défaut. Rendre une classe intrinsèquement non copiable, par exemple, exige de déclarer un constructeur de copie et un opérateur d'affectation par copie privés sans les définir. En C++11, certaines fonctionnalités peuvent être explicitement désactivées. Par exemple, le type suivant est non copiable, ce qui rend le code plus simple et plus propre.

13. L'identifiant override
En C++03, il est possible de créer accidentellement une nouvelle fonction virtuelle alors que l'on voulait redéfinir une fonction de la classe de base. L'identifiant spécial override signifie que le compilateur vérifiera la ou les classes de base pour voir s'il existe une fonction virtuelle avec exactement cette signature. Si ce n'est pas le cas, le compilateur signalera une erreur.
Folly utilise abondamment cette nouvelle fonctionnalité :

14. std::thread
Une classe thread (std::thread) est fournie ; elle prend un objet fonction — ainsi qu'une série optionnelle d'arguments à lui passer — à exécuter dans le nouveau thread. En C++11, travailler avec les threads est plus simple ; voici un exemple tiré du code source de Folly montrant la façon standard de créer un nouveau thread :

15. Les conteneurs non ordonnés
Un conteneur non ordonné est une sorte de table de hachage. C++11 en propose quatre standard :
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
Folly utilise ces nouveaux conteneurs à de nombreux endroits.

Conclusion
Folly utilise presque toutes les nouvelles fonctionnalités de C++11. Explorer son code source vous permettra de mieux comprendre les nouvelles capacités du C++ et la manière dont elles sont utilisées en pratique.
J'encourage tout développeur C++ intéressé par C++11 à télécharger le code source de Folly et à explorer la puissance du C++ moderne.
