IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Utilitaires > Utilitaires du langage
        Type de passage d'argument
        Copy_if
        transform_if
        Foncteur afin de détruire avec std::foreach
        Sérialisation

rechercher
precedent    sommaire    suivant    telechargermiroir


Auteur : Alp
Version : 13/08/2008
Type de passage d'argument
Cette fonction permet de choisir automatiquement le meilleur moyen pour le passage d'argument. Il est tiré de l'article d'Alp Mestan sur les classes de traits et de politiques.

template <typename T>
struct CallTraits
{
    template <typename U, bool Big> struct CallTraitsImpl;
 
    template <typename U>
    struct CallTraitsImpl<U, true>
    {
        typedef const U& Type;
    };
 
    template <typename U>
    struct CallTraitsImpl<U, false>
    {
        typedef U Type;
    };
 
    typedef typename CallTraitsImpl<T, (sizeof(T) > 8)>::Type ParamType;
};

Auteur : Luc Hermitte
Version : 13/08/2008
Copy_if
Cette fonction permet a un comportement semblable à celui de std::copy sauf que l'élément courant est soumis à un prédicat avant d'être copié. Il va de soit que la copie n'a lieu que si le prédicat est validé.

          template <typename InputIterator, typename OutputIterator, typename Pred>
          OutputIterator copy_if(InputIterator begin, InputIterator end,
                OutputIterator destBegin, Pred p) 
          {
            while (begin != end) {
                if (p(*begin)) *destBegin++ = *begin;
                ++begin;
            }
          }
      

Auteur : Luc Hermitte
Version : 13/08/2008
transform_if
Cette fonction est dans la même veine que copy_if. Elle dispose du même comportement que std::transform sauf que la transformation n'a lieu que si un prédicat est réalisé.

    template <typename InputIter, typename OutputIter, typename UnaryOperation, typename Pred>
    OutputIter transform_if(InputIter first, InputIter last,
            OutputIter result, UnaryOperation op, Pred p) 
    {

#ifdef __GNUC__
        __glibcpp_function_requires(_InputIteratorConcept<InputIter>)
        __glibcpp_function_requires(_OutputIteratorConcept<OutputIter,
                // "the type returned by a UnaryOperation"
                __typeof__(__unary_op(*first))>)
#endif
        for ( ; first != last; ++first) {
          if (p(*first)) *result++ = op(*first);
        }
    }
      

Auteur : Luc Hermitte
Version : 13/08/2008
Foncteur afin de détruire avec std::foreach
Cet petit foncteur est là pour vous permettre de réaliser un delete via std::for_each sur conteneur

       struct DeleteObject {
    template <typename T>
    void operator()(const T* ptr) const {
        delete ptr;
    }
      

Auteur : Davidbrcz
Version : 13/08/2008
Sérialisation
On est souvent amené à sérialiser sous forme de chaine de caractères un ensemble de données quelconque par exemple quand on travaille dans le domaine de la programmation réseau. Cette fonction permet de réaliser pour vous ce travail

  template <class CONTENEUR> void serialiser(const CONTENEUR& v,char c,std::string& s)
{
    s.clear();
    std::ostringstream flx;
    
    for (typename CONTENEUR::const_iterator p=v.begin(); p!=v.end();++p)
    {
        flx<<*p; 
        if(p!=v.end())
        flx<<c;
    }

    s=flx.str();
    
    if(v.size() > 0) // pour gérer les cas  v est vide
        s.erase(s.size()-1);
}    

rechercher
precedent    sommaire    suivant    telechargermiroir

Consultez les autres pages sources


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.