60 votes

Des exemples de "c ++ moderne" en action?

Pour les nouveaux et complètement révisée, des astuces et des coins sombres de la STL aller ici: les Fonctions Cachées et les Coins Sombres de la STL

J'ai été en utilisant plus "moderne" des constructions c++ pour un temps, mais un peu superficielle et pas partout. Je suis à la recherche pour les projets open source pour l'étude qui en sont de bons exemples de C++ Moderne et l'utilisation de la STL.

Des choses comme ce qui est suggéré dans Meyer "Effective STL", comme en essayant d'éviter les boucles for et les remplacer par des constructions fonctionnelles, à l'aide de boost::bind et boost::function, etc. Ces sens encore un peu contre nature pour moi, et quand je dois faire quelque chose de rapide et de travail, j'ai tendance à revenir à la libc et de la corde.h (vous pouvez avoir mon strtok lorsque vous sortez de mon froid, mort, mains).

Cependant, j'ai aussi eu l'expérience positive de trouver ce qui serait un changement radical simplifié parce que j'ai utilisé ces constructions, ou être en mesure de mettre en place quelque chose avec seulement quelques lignes de code, car j'ai eu le droit opérateurs et les foncteurs qui traînent. En outre, je ai récemment eu à payer plus d'attention à la concurrence, et donc cela devient encore plus important pour moi.

Pouvez-vous recommander quelques exemples bien écrites projets open source qui font un usage intensif de la STL et autres c++ moderne des techniques que j'ai pu étudier? Je suis particulièrement intéressé par le code de l'application, la navigation, le coup de pouce des sources a été utile, mais c'est par nécessité très générale, car c'est le code de bibliothèque.

Je suis intéressé dans de taille moyenne de plus grands projets, au moins quelques dizaines de milliers de lignes. Il est assez facile de trouver des exemples qui sont à quelques centaines de lignes, mais ce n'est pas trop utile.

Je vous remercie.

23voto

Simon Hughes Points 2297

Meyers est ok, cependant, si vous voulez vraiment pousser vous-même, vous devez lire

Andrei Alexandrescu - Modern C++ Design: Programmation Générique et les Modèles de Conception Appliquée

Il va souffler votre esprit. Ce que vous apprendrez dans ce livre décrit le Loki de la bibliothèque.

L'un de mes favoris est l'int pour les conversions de type:

template <int v>
struct Int2Type
{
    enum { value = v };
};

Je l'ai utilisé dans le passé pour mon C++ XML serilisation bibliothèque de pré-allocation vector<>'s avant de les charger avec des données:

// We want to call reserve on STL containers that provide that function,
// namely std::vector.
// However, we would get a compiler error if we tried to call reserve on
// a STL container that
// did not provide this function. This is the solution.
template <bool b, class T>
class CReserve
{
public:
    static void reserve(T &lst, const int &n)
    { reserve(lst, n, Loki::Int2Type<b>()); }

private:
    static void reserve(T &lst, const int &n, Loki::Int2Type<true>)
    { lst.reserve(n); }

    static void reserve(T &lst, const int &n, Loki::Int2Type<false>)
    { (void)lst; (void)n; }
};

Avis le privé spécialisations ci-dessus. Eh bien, si vous regardez de près, on appelle les réserves (de), l'autre n'a pas. C'est un modèle de spécialisation à l'aide d'un booléen comme un type.

qui à son tour est utilisé par:

template <bool bCallReserve, class T>
bool STLSerializeClassType(MSXML::IXMLDOMNodePtr pCurNode, T &lst, 
                           CXmlArchive &archive, const char *name)
{
    if(archive.IsStoring())
    {
    	...
    } else {
    	lst.clear();

    	T::size_type nCount(0);
    	XML_ELEMENT(nCount);

    	CReserve<bCallReserve, T>::reserve(lst, nCount);

    	while(nCount--)
    	{
    		T::value_type temp;
    		temp.SerializeXml(archive, pCurNode);
    		lst.push_back(temp);
    	}
    }
}

Pour rendre les choses simples utilisateurs de code C++, j'ai ajouté beaucoup de l'aide de définitions

#define SERIALIZE_XML_STL_CLASS(list_name, bCallReserve) \
(HS::STLSerializeClassType<(bCallReserve)>
    (pCurNode, (list_name), archive, (#list_name))
)

donc, dans votre code, vous pouvez utiliser quelque chose comme:

std::list<CFred> fredList;
SERIALIZE_XML_STL_CLASS(fredList, false);

ou pour les vecteurs:

vector<CFred> fredList;
SERIALIZE_XML_STL_CLASS(fredList, true);

De toute façon, je vais arrêter de wittering sur... c'est juste de mettre le simple Int2Type<> modèle à la bonne utilisation. Il y a des tas de trucs forts comme l'obtention du compilateur pour calculer une tonne de choses à l'avance par l'utilisation intelligente des enums. Vraiment géniale livre.

15voto

olli Points 1945

En fait, j'ai eu un coup d'oeil sur Google Chrome et le recommande. Google codage C++ lignes directrices sont un bon support pour grand projet. Ils sont utilisés/adopté dans notre équipe, aussi. En outre, je suis très heureux qu'ils sont de leur C++ les moqueries et les essais des structures de projets open source. Très pratique pour les grands projets où vous manquez beaucoup de test de nice stuff de la Java/Le monde.

10voto

Pukku Points 5571

Ici, vous trouverez plusieurs exemples intéressants d'utilisation de Boost dans des projets open source:
http://www.boost.org/users/uses_open.html

5voto

Pas vraiment de projets, mais en voici quelques extraits:

Exemple d'utilisation de boost::thread / boost::bind:

class X { void expensive_operation( int argument ); };

int main()
{
   X x;
   boost::thread thr( boost::bind( &X::expensive_operation, &x, 1000 ) );
   std::cout << "Thread is processing..." << std::endl;
   thr.join();
}

std::copy, std::transform, BOOST_FOREACH:

int main()
{
   std::vector<std::string> v;
   std::copy( std::istream_iterator<std::string>( std::cin ), 
              std::istream_iterator<std::string>(), std::back_inserter(v) );
   BOOST_FOREACH( std::string & s, v )
   {
      transform(s.begin(), s.end(), s.begin(), toupper);
   }
   std::copy( v.begin(), v.end(), 
              std::ostream_iterator<std::string>(std::cout, " ") );
}

L'extrait de code sera lu à partir de la saisie de l'utilisateur un ensemble de chaînes de caractères dans un vecteur. Ensuite, pour chaque chaîne dans le vecteur, il va convertir en majuscules et, enfin, la sortie de la suite.

Nos applications de faire un usage intensif de boost::signaux et boost::function à découpler les classes où il n'est pas le moment critique, principalement dans les classes de l'INTERFACE utilisateur:

class ContactDetailPanel;
class ContactListPanel {
public:
   void update();
   void edit_completed( bool change );
   boost::function< void ( Contact & ) >& edit_contact();    
};
int main()
{
   ContactListPanel clp;
   ContactDetailPanel cdp;

   clp.edit_contact() = boost::bind( &ContactDetailPanel::edit, &cdp, _1 );
   cdp.edit_completed() = boost::bind( &ContactListPanel::edit_completed, &clp, _1 );
   ui::signal_update().connect( boost::bind( &ContactListPanel::update, &clp ) );     
}

Chaque panneau dispose d'aucune information sur les autres panneaux. Le code qui lie les panneaux ensemble les flux de connaissances (pour modifier un contact, utilisez le contact de panneau détail, les informer de modifier l'achèvement de la liste de contacts). Aussi, il y a un signal global de notifier des panneaux de mises à jour pour le modèle sous-jacent.

C'est particulièrement utile lorsque vous devez écrire le code de test. Il n'est pas nécessaire de mettre en œuvre se moquer de classes pour remplacer le code du travail pour les tests. Tests il vous suffit d'instancier la classe et de connecter les fonctions/signaux de code de test sans la classe testée remarquer, suivant le principe de la moindre intrusion lors des essais.

4voto

Dean Michael Points 2082

Je ne suis pas sûr que "bien écrit", mais il ya quelques choses comme Hypertable et KFS qui sont au niveau du système logiciel utiliser Boost et STL largement.

J'ai entendu certaines choses sur OpenOffice et Google Chrome , mais je n'ai pas regardé le code source pour savoir comment ils utilisent la STL. J'ai jeté un coup d'oeil à KDE mais je ne dirais pas nécessairement que C++ moderne. Je peux vous dire que certains de code, je suis en train de travailler sur est de faire beaucoup de C++ moderne, mais hélas il n'est pas open source, bien que je pense que c'est juste une question de temps et de patience pour obtenir le C++ moderne approche et plus les projets open source adopter les expressions idiomatiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X