Compte tenu de la nouvel ensemble d'outils fournis par le c++ beaucoup de programmeurs, visant à la simplification du code, de l'expressivité, de l'efficacité, de le parcourir par le biais de leur ancien code et de faire des ajustements (certains inutile, certains avec succès) pour atteindre leurs objectifs. Tout en essayant de ne pas perdre trop de temps sur ces travaux et la rendre non intrusive et autonome changements, quelles sont les meilleures pratiques?
Permettez-moi de croix à l'évidence :
-
Utilisation automatique pour exécuter itérateur à base de boucles :
for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite; ++it); // becomes for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
-
Utiliser la cravate pour de multiples affectations qui vient de produire de style C lignes de code ( comment attribuer plusieurs valeurs dans une structure à la fois? )
a = 1; b = 2; c = 3; d = 4; e = 5; // becomes std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
Afin de rendre une classe non héritables simplement déclarer que "final" et de supprimer le code qui atteint un tel comportement http://www.parashift.com/c++-faq/final-classes.html
Utilisez le mot clé delete explicitement masquer les constructeurs/destructeurs au lieu de déclarer privés (par exemple, le code pour créer des tas de base des objets, non copiable objets, etc)
Tour trivial foncteurs créé juste pour facillitate l'exécution d'un seul STL algorithme dans les lambda fonctions (à l'exception de code réduction de l'encombrer, vous aurez la garantie inline appels)
Simplifier RAII habillage d'un objet en utilisant simplement un pointeur intelligent
Se débarrasser de bind1st, bind2nd et il suffit d'utiliser bind
Remplacer écrit à la main le code pour le type de traits (Is_ptr_but_dont_call_for_const_ptrs<> et de tel :) ) avec la norme de code fourni par < type_traits >
Cessez y compris les boost en-têtes pour les fonctionnalités maintenant mis en oeuvre dans la STL (BOOST_STATIC_ASSERT vs static_assert)
Fournir une sémantique de déplacement de classes (bien que ce ne serait pas admissible comme un sale/rapide/facile à changer)
-
Utilisation nullptr , si possible, au lieu de le NULL de la macro et de se débarrasser du code des contenants remplis de pointeurs avec des 0 coulé, type d'objet
std::vector<foo*> f(23); for (std::size_t i(0); i < 23; ++i) { f[i] = static_cast<foo*>(0); } // becomes std::vector<foo*> f(23, nullptr);
-
Effacer les données vectorielles accès à la syntaxe
std::vector<int> vec; &vec[0]; // access data as a C-style array vec.data(); // new way of saying the above
-
Remplacer throw() noexcept (à part éviter de le obsolète exception specifiation vous obtenez certains des avantages de rapidité http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler @ 00.29.42)
void some_func() noexcept; // more optimization options void some_func() throw(); // fewer optimization options void some_func() ; // fewer optimization options
-
Remplacer le code où vous poussez un temporaire dans un récipient et espère que l'optimiseur serait ellide la copie de loin, avec un "emplace" fonction lorsqu'ils sont disponibles, afin de parfaitement en avant l'argument et de construire directement un objet dans un contenant sans que temporaire.
vecOfPoints.push_back(Point(x,y,z)); // so '03 vecOfPoints.emplace_back(x, y, z); // no copy or move operations performed
Mise à JOUR
La réponse par Shafik Yaghmour a été à juste titre décerné par la générosité pour avoir le plus grand de l'acceptation par le public.
La réponse par R Sahu a été mon acceptée, parce que la combinaison de fonctionnalités qu'il propose capture l' esprit de refactoring : rendre le code plus clair et plus propre, plus simple et élégant.