IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Execution d'une partie de code en fonction d'argument templates


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Execution d'une partie de code en fonction d'argument templates
    Bonjour,

    Ca rouille quand on ne C++ pas pendant un bout de temps ^^
    Une partie de mon code...

    (nb: UpdateServerSession & AuthClientSession = arguments template)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
            template<
                      typename UpdateClientSession,
                      typename UpdateServerSession,
                      typename AuthClientSession,
                      typename AuthServerSession>
    // fun
    // code...
                                    catch(const handlers::change_handler<UpdateServerSession>& ch)
                                    {
                                        if(!std::is_same<UpdateServerSession, net::null_class>::value)
                                        {
                                            delete client_iterator->second;
                                            client_iterator->second = new UpdateServerSession(socket);
                                        }
                                    }
                                    catch(const handlers::change_handler<AuthClientSession>& ch)
                                    {
                                        if(!std::is_same<AuthClientSession, net::null_class>::value)
                                        {
                                            delete client_iterator->second;
                                            client_iterator->second = new AuthClientSession(socket, ch.some_id);
                                        }
    Le soucis, c'est que le compilo se fiche royalement de mon if(! std::is_same ) et tente de compiler, alors forcément...
    En gros, je passe une classe vide dans mes arguments templates:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysocket.launch<net::null_class, net::null_class, sessions::client<Protocol>, Ssp>(myserver);
    Et du coup, bah j'ai une tonne de problèmes de construction avec null_class.
    /media/data/dev/projects/baws/baws/net/networker_server.h|82|error: no matching function for call to ‘net::null_class::null_class(net::socket_impl<net::protocols::TCP>&)’|
    De plus, les arguments templates peuvent tous etre = null_class.

    J'ai tenté d'envelopper le probleme autour d'une structure & une lambda:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template<bool Do, typename Fn>
        struct execute
        {
            typename std::enable_if<Do, void>::type
            call(Fn f) { f(); }
        };
     
    // ...
     
                                            auto f = [&client_iterator, &socket](void) -> void
                                            {
                                                delete client_iterator->second;
                                                client_iterator->second = new UpdateClientSession(socket);
                                            };
                                        lambda::execute<!std::is_same<UpdateClientSession, net::null_class>::value, decltype(f)>::call(f);
    Mais le problème persiste.
    J'aimerais avoir une solution qui passe par un template, et que le compilo ne tente pas d'executer le 'new' pour eviter des entourloupes dans mon code (car là, j'aurais encore plus de boulot !)
    Bon il est tard, j'espere m'exprimer bien !
    Merci d'avance

    nico

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Ce que je ferais c'est une structure annexe UpdateServerSessionDeleter que tu spécialises en fonction du type, de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    template <class T>
    struct UpdateServerSessionDeleter
    {
      template <class... Args>
      static void reset(net::null_class d, Args... args)
      {}
    };
     
    template <>
    struct UpdateServerSessionDeleter<UpdateServerSession>
    {
      template <class... Args>
      static void reset(shared_ptr<UpdateServerSession> &d, Args... args)
      {
        d = make_shared_ptr<UpdateServerSession>(args...);
      }
    }
    Note que j'ai utilisé des shared_ptr, peut-être que unique_ptr conviendrait mieux. D'une manière général, si il y a plus de points de variation, fait une classe de police pour tes types.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer une partie du code une seul fois
    Par oami89 dans le forum VB.NET
    Réponses: 2
    Dernier message: 11/05/2011, 20h06
  2. jsp : erreur dans une partie de code non executée
    Par julien20vt dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2010, 10h00
  3. Réponses: 5
    Dernier message: 26/04/2010, 18h14
  4. une partie du code a disparu
    Par recup dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 08/03/2005, 10h08
  5. Indenter une partie du code
    Par KooX dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2004, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo