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...