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 :

[Template]Besoin d'une spécialisation de template différente


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut [Template]Besoin d'une spécialisation de template différente
    Salut,

    J'ai un petit problème.
    Pour simplifier des algorithmes, j'ai besoin d'utiliser des éléments d'un groupe cyclique.

    Concrètement : symboliquement
    ( {1, e, e^2 } , * ) groupe cyclique.
    1 est l'élément neutre, e est le générateur.
    e^3 = 1
    e^n = e*...*e (n fois)

    Bien sûr en pratique j'utilise des int, et pas des 'e'.

    Avant j'avais juste fait une classe template CyclicGroup, on instanciait un objet de cette classe, et on le construisait en injectant des éléments.

    Après pour faire des opérations, j'passais des éléments en argument dans les méthodes de l'objet.

    Seulement c'est chiant.

    Exemple rédigé vite fait, commenté, puis discuté :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    // J'mets pas les constructeurs
     
    template <class T>
    class CyclicGroup
    {
        vector<T> set;
     
    public:
        void Add(const T & t); // Ajoute un élément, le premier élément est l'élément neutre, le second le générateur
        int Card(); // Cardinal du groupe
    };
     
    template <class T>
    class CyclicElmt
    {
        CyclicGroup<T> & G;
        T val;
     
    public:
        void Bind(const CyclicGroup<T> & G_)
        {
            G = G_;
        }
     
        CyclicElmt<T> operator==(const CyclicElmt & e);
        CyclicElmt<T> operator=(const CyclicElmt & e);
        CyclicElmt<T> operator=(T t);
        CyclicElmt<T> operator*(const CyclicElmt & e);
        CyclicElmt<T> operator^(int i); // Attention à la priorité
        operator T();
    };
     
    // Utilisation
     
    CyclicGroup<int> G;
    G.Add(1);
    G.Add(2);
    G.Add(3);
     
    CyclicElmt<int> a, b;
     
    a.Bind(G);
    b.Bind(G);
     
    a = 1;
    b = 2;
     
    a = b^2;
    La vous voyez, le principal problème c'est qu'il faut bind chaque élément séparément à son groupe.
    Moi j'aimerais bien que ça soit fait à la déclaration de a et b.

    En fait le must ce serait de ne meme pas préciser le type int, mais de passer en argument G quelque part, sauf que c'est pas possible pour les templates, ils prennent des types et pas d'instances.

    Si vous avez des constructions mystiques qui seraient plus cools à utiliser les boss de la méta-programmation, merci d'avance .

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut Re: [template]Besoin d'une spécialisation de template différ
    Citation Envoyé par HanLee
    En fait le must ce serait de ne meme pas préciser le type int, mais de passer en argument G quelque part, sauf que c'est pas possible pour les templates, ils prennent des types et pas d'instances.
    Qu'est-ce qui te fais dire ça ?

    Extrait de la norme :
    14.3.2 Template nontype arguments [temp.arg.nontype]
    1 A templateargument for a nontype, nontemplate templateparameter shall be one of:
    — an integral constantexpression of integral or enumeration type; or
    — the name of a nontype templateparameter; or
    — the name of an object or function with external linkage, including function templates and function templateids but excluding nonstatic class members, expressed as idexpression; or
    — the address of an object or function with external linkage, including function templates and function templateids but excluding nonstatic class members, expressed as & idexpression where the & is optional if the name refers to a function or array; or
    — a pointer to member expressed as described in 5.3.1 .
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Ca veut dire qu'on peut faire ça ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CyclicGroup<int> G;
     
    CyclicElmt<G> a, b;
    Mais comment on exploiterait ensuite l'argument G ?
    En fait j'vois pas du tout.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Le code suivant marche :
    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
    24
    25
    26
     
    #include <iostream>
    using namespace std;
     
    template <class T> struct G
    {
    	typedef T type;
    	G(int id) : typeId(sizeof(T)), instanceId(id) {}
    	int typeId;
    	int instanceId;
    };
     
    template <class T, G<T> *g> struct elem
    {
    	int instanceId;
    	elem() : instanceId(g->instanceId) {}
     
    };
     
    G<int> globalG(42);
     
    int main()
    {
    	elem<int, &globalG> myElem;
    	cout << myElem.instanceId;
    }
    Il y a par contre une limitation : le G doit être déclaré en global.

    Une alternative si l'ensemble des groupes cyclliques possibles est connu à la compilation pourrait être de passer un argument template de type énumération.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne suis pas sûr d'avoir tout suivi donc désolé si ma question est idiote, mais pourquoi vouloir passer G en paramètre template et non à un constructeur, par exemple ?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ca, je n'en sais rien...
    Je pense que le principal intérêt en l'occurence est de pouvoir faire un typedef qui englobe les arguments templates et permet d'utiliser un élément comme s'il s'agissait d'un type de base. Il doit être plus clair d'écrire :

    Que d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element<double> a(GroupeDesRacines12emeDeLUnite);
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    >JolyLoic : ah ouais, mais ça me gêne un peu que G soit global...

    EDIT : oui voilà c'est ce que j'veux faire =)

    > Loulou : parce qu'en fait j'voulais que chaque instantiation G de CyclicGroup représente un type différent à chaque fois.

    Et que donc on ferait un truc du genre CyclicElmt<G> pour déclarer un élément de G.

    Et comme ça pas besoin de préciser G à chaque fois que je déclare un élément de G, parce que faire ça serait un peu lourd pour moi :/ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CyclicElmt<int> a(G), b(G)

  8. #8
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Loulou24
    Je ne suis pas sûr d'avoir tout suivi donc désolé si ma question est idiote, mais pourquoi vouloir passer G en paramètre template et non à un constructeur, par exemple ?
    En fait peut-être qu'à travers le constructeur, tu pensais à RAII.
    Bah au pire j'vais faire ça.

Discussions similaires

  1. Réponses: 20
    Dernier message: 12/11/2014, 13h33
  2. Réponses: 3
    Dernier message: 22/04/2013, 12h07
  3. Spécialisation totale d'une sous-classe template.
    Par méphistopheles dans le forum C++
    Réponses: 3
    Dernier message: 28/06/2010, 16h12
  4. Réponses: 2
    Dernier message: 02/08/2005, 11h44
  5. [Template] methode template d'une classe pas template
    Par bigquick dans le forum Langage
    Réponses: 8
    Dernier message: 25/03/2005, 15h09

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