Partage
  • Partager sur Facebook
  • Partager sur Twitter

extent, constecpr & cie

    27 juin 2011 à 18:42:04

    Je reprends une discussion qui était au mauvais endroit : les exercices

    Citation : Goten

    Citation : lmghs

    gcc 4.6 me file des messages d'erreurs peu clairs ici.
    Je peux appeler extent directement en jouant avec decltype.
    Ensuite, je n'ai pas souvenir que T& puisse matcher un tableau statique dans une fonction template. Je dirais que le problème vient de là.
    Concernant la première fonction, gcc me la refuse comme constante par contre



    $ cat main.cpp 
    #include <cstddef>
      
    template<class T, size_t N>
    constexpr size_t bound(T (&)[N])
    { return N; }
    
    
    template <size_t N>
    void dsp()
    {}
    
    int main()
    {
        int tab[10];
    
        dsp<bound(tab)>();
    }
    $ g++ -std=c++0x main.cpp 
    $ g++ -v
    gcc version 4.6.1 20110526 (prerelease) (Debian 4.6.0-10)
    


    Citation : Goten

    Au fait std::extent fait exactement ça. (je l'avais loupé celui là). Pas besoin d'essayer de la jouer clever :

    template <typename T>void foo(const T& t)
    {
        std::cout << std::extent<T>::value;
    }
    
    int main()
    {
        int tab[10];
        foo(tab);
    }
    



    Bien entendu il renvoie une std::integral_constant donc ::value est aussi une constexpr.

    Citation : lmghs

    OK. Je vois. Le problème arrive quand le tableau est une variable membre.


    Hum, t'as un snippet? Je vois pas de raison immédiate pour que ça marche pas.


    extent fais ça, mais il est franchement à rallonge, et il semblerait que l'on ne puisse pas passer un tableau statique en paramètre d'une fonction template sans sortir les super signatures, et donc lever l'intérêt d'extent.

    Pour le snippet, très simple:

    template<class T, size_t N>
    constexpr size_t bound(T (&)[N])
    { return N; }
    
    struct S {
        int t[10];
        S() {
            static_assert(bound(S) == 10, "OK!");
        }
    };
    
    • 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.
      27 juin 2011 à 18:52:26

      (merci pour le nouveau thread, j'ai voulu le faire lors de mes 3 dernier post mais je suis trop faignant)

      Citation : lmghs


      extent fais ça, mais il est franchement à rallonge, et il semblerait que l'on ne puisse pas passer un tableau statique en paramètre d'une fonction template sans sortir les super signatures, et donc lever l'intérêt d'extent.



      hum, statique static ou statique par opposition à dynamique ?

      Citation


      template<class T, size_t N>
      constexpr size_t bound(T (&)[N])
      { return N; }
      
      struct S {
          int t[10];
          S() {
              static_assert(bound(S) == 10, "OK!");
          }
      };
      

      (je suppose que bound(S) est une typo bien entendu).

      ah oui parce que this n'est pas constant dans ce cas là.
      J'aurais écrit :
      static_assert(std::extent<decltype(t)>::value == 10, "OK!");
      • Partager sur Facebook
      • Partager sur Twitter
        27 juin 2011 à 18:59:46

        Tout à fait, c'est une typo.
        decltype+extent marche très bien, je suis d'accord.
        Seulement, on se retrouve avec une expression non encapsulée (il est beau le "::value") et très complexe à vendre à ceux qui ne développent pas des bibliothèques templates.
        • 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.
          27 juin 2011 à 21:09:32

          Citation : Luc

          et il semblerait que l'on ne puisse pas passer un tableau statique en paramètre d'une fonction template sans sortir les super signatures


          Je ne comprend pas trop ce que tu veux dire par là, tu parles d'un code du genre :
          template<class T>
          void foo(T) //"super signature" T& ?
          { /*...*/ }
          
          //
          int tab[] = {/*...*/};
          foo(tab);
          

          Qui ne compilerai pas ?

          Citation : Luc

          Ensuite, je n'ai pas souvenir que T& puisse matcher un tableau statique dans une fonction template. Je dirais que le problème vient de là.


          Normalement si, Vandervoorde page 169, section 11.1 :
          template<typename T> void g(T&); //P is also T
          
          double x[20];
          
          g(x); //reference parameter : T is double[20]
          

          (pasage sur la déduction des arguments template et les decay conversion, P est un notation introduite dans le texte avant)

          @Goten: Ok, c'est donc ma version de GCC qui est pas au point sur le constepxr.
          • Partager sur Facebook
          • Partager sur Twitter
          FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
            27 juin 2011 à 22:50:31

            Pour le "::value" ; il est simplement corrigable par :
            template <typename T>
            constexpr size_t bound(T &) {
                return std::extent<T>::value;
            }
            


            Comme ça, on récupère bien le fonctionnement d'extent, sans le "::value" qui gênait.
            • Partager sur Facebook
            • Partager sur Twitter
              27 juin 2011 à 23:31:47

              @equinoxe, je parlais d'un code comme celui de goten, ou le vieux hack du array_size que j'utilise encore pour l'instant.

              @goten, c'est exactement ce que j'aurais voulu sauf que mon gcc 4.6 me refusait ce code : bound ne matchait pas le tableau que je lui passais. Tu m'as mis un doute, je re-testerai demain sur le bon compilo.
              • 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.

              extent, constecpr & cie

              × 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