2010-12-12 16 views
4

Possible en double:
What are your favorite C++ Coding Style idiomsQuels sont vos idiomes C++ préférés?

Chers fans de C++,

Pouvez-vous énumérer ici vos idiomes C++ préférés? Il est préférable d'énumérer ceux qui sont utiles mais pas encore connus.

Tout d'abord, je mets un de mes:

Pour éviter la répétition fastidieuse for (size_t i = 0; i < n; ++i) {...}, j'utiliser une macro comme ceci:

#define LOOP(n) for (size_t _i = 0; _i < n; ++_i) 

_i est un espace réservé bind utilise.

Je peux donc écrire:

vector<int> coll(100); 
LOOP (100) 
{ 
    coll[_i] = _i; 
} 

LOOP (100) 
{ 
    auto a = _i; 
    LOOP (100) 
    { 
     auto b = _i; 
     cout << a << b; 
    } 
} 
+6

Re votre exmaple: C'est quelque chose que votre EDI devrait vous aider avec, pas obscurcir les macros. – Mchl

+0

@Mchl, je pense que LOOP peut exprimer plus clairement mon intention ici. – xmllmx

+9

+1 pour une question décente, mais -1 pour un exemple terrible et terrible. Net zéro vote :) – NPE

Répondre

4

Bonne question, mais je pense que votre exemple est mauvaise! Votre macro LOOP ne clarifie rien - elle cache en fait votre intention aux programmeurs qui n'utilisent pas votre macro, et elle ne ressemble même pas à C++ - ma première réaction à votre extrait serait "est-ce même C++?" ou "qu'est-ce qui ne va pas avec un for?". Il peut être fastidieux d'écrire les boucles encore et encore, mais nous savons tous que tout le monde passe beaucoup plus de temps à lire et à maintenir le code qu'à l'écrire, donc ce n'est pas une perte de temps d'écrire for, et c'est beaucoup plus clair. Vous pouvez continuer à faire valoir votre point de vue, mais vous devez savoir que l'utilisation de macros de cette façon est une technique largement acceptée - d'autres personnes regardant votre code vous appelleront aussi dessus.

Quoi qu'il en soit, pour ajouter une réponse réelle - mon langage préféré en C++ 0x est un vecteur de unique_ptr:

std::vector<std::unique_ptr<T>> my_container; 

Il présente les avantages suivants: - essentiellement un vecteur sûr de pointeurs:

  • Il fournit un accès aléatoire dans O (1) temps
  • les éléments sont garantis de ne jamais se déplacer dans la mémoire même lorsque réaffectant (vous pouvez prendre en toute sécurité l'adresse de T s et les stocker)
  • rapide pour des tâches telles que le tri (traînant juste quelques conseils, pas la copie d'objets lourds)
  • Exception sécurité et aide à prévenir les fuites de mémoire - erase() sur un élément libère également la mémoire
  • flexible - vous pouvez std::move() pointeurs hors du conteneur et les mettre ailleurs

Il maintient une ou deux inconvénients:

  • Chaque élément est alloué sur le tas qui peut avoir des performances aurait mis en cause ations si l'ajout/la suppression d'un grand nombre d'éléments, plus les éléments peuvent être éloignés dans la localité de cache perdre la mémoire
  • Iteration nécessite indirection double (*i)->member syntaxe - mais je ne pense pas que ce soit une grosse affaire

Toutefois, en particulier pour les objets lourds, je pense que c'est presque un conteneur idéal.

9

RAII est en haut de ma liste. Très utile dans une implémentation générique comme libloki de Andrei Alexandrescu.

+3

+1 RAII est la seule chose C++ que je souhaite vraiment d'autres langues supportées. – delnan

+0

+1 pour RAII et vitesse de réponse. –

5
+4

Je savais que tu dirais ça. : D – Nawaz

+0

@Nawaz: Je voulais dire RAII mais quelqu'un l'a déjà mentionné. Je devais nommer quelque chose * différent *. –

+0

@Nawaz: Quelqu'un a regardé Judge Dredd trop :) –

3

RAII + ouverture d'un bloc imbriqué si la portée de vie exacte nécessaire:

Lock lock(this); 
ResourceHolder resource(findResource()); 
WorkerHolder worker(resource); 
if (!worker) 
    return false; // frees the resource and unlocks the lock 
{ 
    WorkAssignment assignment(worker); 
    assignment.Execute(); 
} // assignment cleaned up even in case of exception 
...