Partage
  • Partager sur Facebook
  • Partager sur Twitter

Templates bornés

    24 mars 2015 à 11:53:28

    Bonjour. :)

    Je cherche à borner les paramètres d'une classe avec c++11 :

    template<typename T, typename = typename std::enable_if<std::is_base_of<Classe, T>::value, T>::type>
    class A
    {
       // ...
    };

    Ici le paramètre de la classe A est borné par la classe 'Classe'.

    Et maintenant, je voudrais borner le paramètre par la classe elle-même. :D

    template<typename T, typename = typename std::enable_if<std::is_base_of<A<T>, T>::value, T>::type>
    class A
    {
       // ...
    };

    Mais là il me dit à la l.1 qu'il ne connait pas A. Donc j'ai essayé d'ajouter une previous declaration, sans spécifier le 2e paramètre du template. Mais du coup, le nombre de paramètre ne correspond pas. Du coup je suis un peu perdu. :euh:

    Merci. ;)

    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2015 à 12:19:08

      Le vrai nom de la classe, c'est A<T, second param qu'il te faudra nommer>, j'imagine.
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        24 mars 2015 à 16:09:44

        Oui mais du coup, faut-il faire une forward déclaration ? Si oui comment pour que ça compile ? :D
        • Partager sur Facebook
        • Partager sur Twitter
          24 mars 2015 à 17:44:11

          template<typename T, typename U = typename std::enable_if<std::is_base_of<A<T,U>, T>::value, T>::type>
          class A
          {
             // ...
          };
          As-tu essayé ça ? (je ne garantis pas que cela passe, mais si le CRTP s'applique bien, il te faut le nom complet de ta classe, et A<T,U> sera le nom complet de ta classe)
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            24 mars 2015 à 19:41:06

            Du coup le 2e paramètre maintenant nommé U me permet d'ajouter la forward declaration :

            template<typename T, typename U>
            class A;

            Du coup maintenant il connait le A du 'std::is_base_of' mais ne connait pas le U du std::is_base_of. :o

            EDIT :

            Après il est aussi possible de partir sur une assertion :

            http://stackoverflow.com/questions/17646558/can-a-template-extend-a-class-in-a-c-function

            -
            Edité par Maluna34 24 mars 2015 à 19:44:32

            • Partager sur Facebook
            • Partager sur Twitter

            Templates bornés

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown