Wann sind Template-Parameter nicht erreichbar?



  • Hi,

    ich les grad diese Seite über Traits durch. Da steht folgendes:

    Notice that in all the examples thus far, each template provided public typedefs of its parameters, and also anything that depended on them. This is no accident: in a wide variety of situations, the parameters used to instantiate a template are not available, and can only be retrieved if provided as typedefs in the template declaration. The moral: always provide these typedefs.

    Kann bitte mir einer ein Beispiel für so einen Fall nennen? Mir fällt leider keiner ein.



  • template <class charT, class traits = ios_char_traits<charT> >
      class basic_streambuf {
        public:
        // Wenn die nächsten 2 Zeilen nicht dawären
          typedef traits traits_type;             // <--  braucht man damit man die überhaupt benutzen kann. 
          typedef traits_type::int_type int_type; // <--  braucht man damit man die überhaupt benutzen kann.
    
          int_type eof() { return traits_type::eof(); } // würde das nicht gehen
          ...
          int_type sgetc();  // und das auch nicht (int_type
          int sgetn(charT*, int N);
      };
    

    MfG



  • Wo liegt denn der genaue Sinn vor allem vom ersten typedef?



  • Weil man den Template Parameter "traits" (der 2. Template parameter)
    nicht von aussen nutzen kann.

    d.h. ausserhalb würde das nicht gehen:

    typedef std::basic_streambuf::traits traits;
    

    würde nicht funktionieren.

    aber innerhalb der Klasse geht das, daher ist dieses typedef an dieser stelle.
    dann ist das möglich:

    typedef std::basic_streambuf::traits_type traits;
    

    Das ist auch das was dieser Satz da oben aussagt.

    MfG



  • Danke dir 🙂



  • Weil man den Template Parameter "traits" (der 2. Template parameter)
    nicht von aussen nutzen kann.

    man kann ihn mit einem bissl tricksen nutzen:

    //zb
    
    template<class charT,class Traits>
    void foo(const basic_streambuf<charT,Traits>& buf){
        typedef typename Traits::int_type int_type;
    }
    

    würde ich aber trotzdem nicht nutzen,ist zu unsicher(niemand garantiert, dass streambuf nur diese 2 template parameter hat)



  • @ otze
    Bald werd ich dich mal mit so'n paar fragen nerven können *g*

    Ich lese grad Modern C++ Design und arbeite mich dann da rein. Ist ein verdammt interessantes gebiet ^^

    MfG :p 😃

    // edit: Rechtschreibfehler...


Anmelden zum Antworten