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 :

Type traits pour détecter deux spécialisations d'une même classe template


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Type traits pour détecter deux spécialisations d'une même classe template
    Bonjour amis métaprogrammeurs.

    Je cherche à savoir si il est possible de créer un type_traits dont la ::value est true lorsque les 2 classes passées en paramètre sont 2 spécialisations d'une même classe template (avec ou non des paramètres template différents), et false si ce n'est pas le cas. Ce qui complique la tâche c'est que j'aimerai que ça marche avec des paramètres templates qui peuvent être des types mais aussi des valeurs.

    Je souhaiterais par exemple que quand je passe un std::array<double, 3> et un std::array<int, 5>, le type_traits retourne true (les deux types sont des std::array), et false quand je passe par exemple un std::array<double, 3> et un std::vector<int>.

    J'offre mon éternelle reconnaissance à celui qui trouvera comment faire cela en C++11

  2. #2
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 45
    Points
    45
    Par défaut Boost::is_same

  3. #3
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Je ne suis pas sur de bien comprendre. En tous les cas le std::is_same de C++11, ne fournis pas cette fonctionnalité:
    std::is_same<std::array<double, 3>, std::array<int, 5>>::value
    est false.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Tel quel, je ne crois pas que is_same apporterait le résultat souhaité.
    Par contre, on y arriverait peut-être de cette manière :

    template<class T, class U>
    struct is_same_base : std::is_same<T,U>
    {};

    // (il manque peut-être 1 ou 2 typename par-ci par-là)
    template<class BaseClass, class... LeftArgs, class... RightArgs>
    struct is_same_base <BaseClass<LeftArgs>, BaseClass<RightArgs>> : std::true_type
    {};
    -- EDIT --
    Bon, l'exemple du dessus ne fonctionne pas.
    Celui-là a l'air de fonctionner :
    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 <type_traits>
    #include <iostream>
    #include <vector>
    #include <set>
     
    template<class T, class U>
    struct is_same_base : std::is_same<T,U>
    {};
     
    template< 
        template <class... BaseArgs> class BaseClass,
        class... LeftArgs,
        class... RightArgs
        >
    struct is_same_base <BaseClass<LeftArgs...>, BaseClass<RightArgs...> > : std::true_type
    {};
     
    int main()
    {
        std::cout << is_same_base<std::vector<int>, float >::value << std::endl; // false
        std::cout << is_same_base<std::vector<int>, std::vector<int> >::value << std::endl; // true
        std::cout << is_same_base<std::set<int>, std::vector<int> >::value << std::endl; // false
        std::cout << is_same_base<std::vector<int>, std::vector<float> >::value << std::endl; // true
        return 0;
    }

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/01/2015, 13h23
  2. créer une macro pour comparer deux cellules d'une même colonne
    Par barbie-9 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/05/2012, 19h28
  3. comment faire pour aligner deux partie d'une table enboitée
    Par felosa dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 27/05/2008, 21h03
  4. Réponses: 5
    Dernier message: 30/01/2007, 13h23
  5. [POO] Deux constructeurs pour une même classe
    Par amika dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2006, 16h31

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