Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 17h21   #1
Awakening
Membre du Club
 
Inscription : septembre 2010
Messages : 67
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 67
Points : 61
Points : 61
Par défaut Petit problème de structure et de variadic template

Bonjour,

J'aimerai simplifier l'utilisation d'une structure.
Actuellement, j'affiche la taille d'un "tableau statique" perso de la manière suivante.
Code :
1
2
cout << A<int>::B<0,0,0>::size << endl; // affiche 3
cout << A<char>::B<0,0,0,0>::size << endl; // affiche 4
La structure 'A' me sert à définir le type d'élément et la structure B à contenir mes élements.
Voici mon code :
Code :
1
2
3
4
5
6
7
8
9
template <typename I>
struct A
{
    template <I ... elements>
    struct B
    {
        static const int size = sizeof...(elements);
    };
};
Maintenant j'aimerais simplifier ma méthode d'affichage en utilisant qu'une seule structure comme par exemple:
Code :
cout << C<int, 0, 0, 0>::size << endl; //afficherait 3
Le premier paramètre de template étant le type et le reste étant la liste d'élement.

Ma question : est-ce possible ? Et si oui de quelle manière ?

A noter que cette version ne compile pas :
Code :
1
2
3
4
5
template <typename I, typename... elements>
struct C
{
    const int size = A<I>::B<elements...>::size;
};
J'ai comme l'impression que je surestime mon compilateur.

Merci.
Awakening est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 18h35   #2
saad.hessane
Membre éprouvé
 
Avatar de saad.hessane
 
Homme Saâd Hessane
Ingénieur développement logiciels
Inscription : avril 2008
Messages : 302
Détails du profil
Informations personnelles :
Nom : Homme Saâd Hessane
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2008
Messages : 302
Points : 436
Points : 436
Bonjour,

Personnellement je ne m'y connais pas trop en variadic templates, mais je m'y intéresse comme étant une nouveauté du standard.
De ce que je sais (je te pris de me corriger), les templates sont utilisés pour définir des types génériques.
Quand je fais :
Code c++ :
template <typename T> class A;
Je peux faire :
Et non pas :
Et donc par extension aux variadic templates, ceci :
ou ceci
... n'a aucun sens.

Je me trompe ?
saad.hessane est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/12/2012, 19h14   #3
Trademark
Membre émérite
 
Avatar de Trademark
 
Inscription : février 2009
Messages : 563
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 563
Points : 806
Points : 806
Salut,

Ceci marche chez moi :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
template <typename I, I... elements>
struct C
{
    static const size_t size = sizeof...(elements);
};
 
int main(int argc, char** argv)
{
  std::cout << C<int, 0,0,0>::size << std::endl;
}
Ta deuxième version ne compilait pas simplement parce que typename... elements attendait une suite de type et non pas de valeur.
Trademark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 19h14   #4
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 625
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 625
Points : 13 345
Points : 13 345
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
Salut
Citation:
Envoyé par saad.hessane Voir le message
Bonjour,

Personnellement je ne m'y connais pas trop en variadic templates, mais je m'y intéresse comme étant une nouveauté du standard.
De ce que je sais (je te pris de me corriger), les templates sont utilisés pour définir des types génériques.
Quand je fais :
Code c++ :
template <typename T> class A;
Je peux faire :
Et non pas :
Et donc par extension aux variadic templates, ceci :
ou ceci
... n'a aucun sens.

Je me trompe ?
Oui, tu te trompes, mais pas de loin

En effet, si tu regarde attentivement le code de B, il prend un nombre inconnu d'élément de type I.

Et tu peux parfaitement écrire un code (template mais sans variadique ) proche de
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <int i>
struct Factorielle
{
    enum {value  = i * Factorielle<i-1>::value};
    /* ou, en utilisant un static const int 
     static const int value = i * Farctorielle<i-1>::value;
    */
};
/* car il faut bien arrêter la récursion */
template <>
struct Factorielle<0>
{
    enum {value  = 1};
 
    /* ou, en utilisant un static const int 
     static const int value = 1;
    */
};
int main()
{
    std::cout<< Factorielle<5>::value;
}
Et la meilleure de toutes, c'est que ce code sera sans doute un peu plus lent à compiler que le code qui calculerai la factorielle classique, mais il sera en fait beaucoup plus rapide à l'exécution car l'appel à Factoriel sera remplacé par... la valeur de la factorielle, directement dans l'exécutable

Enfin, bref, comme A définit int comme étant le paramètre template I, tu indiques au compilateur qu'il doit s'attendre à obtenir un nombre inconnu d'entiers, et tu peux donc parfaitement donner... un nombre inconnu d'entiers

Note cependant que, sous cette forme, il reste malgré tout un très léger problème (enfin, je parle de problème, mais c'est encore à voir :

C'est le fait que tu ne pourrais pas placer un objet de type A<int, 0, 0, 0> dans la même collection qu'un objet de type A<int, 0, 0, 1> parce que, comme il y a un des paramètre template qui est différent, il s'agit, ni plus ni moins, que d'un autre type (enfin, je crois )

Mais même cela est un problème facilement contournable
__________________
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2012, 19h42   #5
saad.hessane
Membre éprouvé
 
Avatar de saad.hessane
 
Homme Saâd Hessane
Ingénieur développement logiciels
Inscription : avril 2008
Messages : 302
Détails du profil
Informations personnelles :
Nom : Homme Saâd Hessane
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2008
Messages : 302
Points : 436
Points : 436
@koala01 : Merci, je me sens moins bête tout d'un coup .
saad.hessane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 01h30   #6
Awakening
Membre du Club
 
Inscription : septembre 2010
Messages : 67
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 67
Points : 61
Points : 61
Citation:
Envoyé par Trademark Voir le message
Salut,

Ceci marche chez moi :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
template <typename I, I... elements>
struct C
{
    static const size_t size = sizeof...(elements);
};
 
int main(int argc, char** argv)
{
  std::cout << C<int, 0,0,0>::size << std::endl;
}
Ta deuxième version ne compilait pas simplement parce que typename... elements attendait une suite de type et non pas de valeur.
Effectivement, cela fonctionne. C'est étrange parce qu'il m'avait sembler tester ça, sans succès.

Dans tous les cas, merci beaucoup.
Awakening est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h16.


 
 
 
 
Partenaires

Hébergement Web