template<typename,class>
-
Hi. Ich bin grad ueber was gestolpert was ich nciht richtig versthe oder besser gesagt keinen blssen schimmer hab.
Wo ist der Unterschied zwischen
template<typename T>und
template<class T>und wieso schreibt man z.B.
template<const int a, typename T>oder ähnlich.
Ich wusste auch mit diesem stueck code nichts anzufangen, welches mich letzendlich zu den oberen Fragen getrieben hat:template <class _Arg1, class _Arg2, class _Result> struct binary_function { typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; };Wenn ich hiervon nun eine klasse ableite, den () Operator ueberlade und das ganze in meinetwegen transform reinschmeisse, weiss transform wie es das Funktionsobjekt( Ist das richtig) benutzen kann. Wieso?

MFG chewbo
-
zwischen class und typename gibt es keinen Unterschied, die sind beide gleichwertig. class ist für schreibfaule.

Aber manche benutze class um zu sagen: "hier bitte eher einen komlexen Typ einsetzen" und bei typename "hier bitte einen primitiven Typ (int, char...) einsetzen".
Aber im Prinzip ist es dem Compiler schnuppe.
template<const int a, typename T> ist glaub ich eine partielle Spezialisierung. Also der erste Parameter ist schon mal vorgegeben.
-
chewbo schrieb:
Hi. Ich bin grad ueber was gestolpert was ich nciht richtig versthe oder besser gesagt keinen blssen schimmer hab.
Wo ist der Unterschied zwischen
template<typename T>und
template<class T>nun, das ist einfach.
oben steht typename und unten steht class. das ist der unterschied.
manche leute ziehen manchmal typename vor, um zusätzlich auszudrücken, dass es ihnen um einen x-beliebigen typ (und nicht nur klassen) geht. lesbarkeit. ab und zu zumindest. in anderen kontexten hat typename allerdings auch andere bedeutungen.und wieso schreibt man z.B.
template<const int a, typename T>oder ähnlich.
wieso man das schreibt? hängt wahrscheinlich davon ab, was man haben möchte. wenn du ein solches template haben willst, schreibst du eben das. mehr info (was unklar ist) bringt mehr awort. was du zb damit tun kannst, ist, während der compilezeit dir schon alle möglichen sachen ausrechnen (google: template-metaprogramming)
Ich wusste auch mit diesem stueck code nichts anzufangen, welches mich letzendlich zu den oberen Fragen getrieben hat:
template <class _Arg1, class _Arg2, class _Result> struct binary_function { typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; };Wenn ich hiervon nun eine klasse ableite, den () Operator ueberlade und das ganze in meinetwegen transform reinschmeisse, weiss transform wie es das Funktionsobjekt( Ist das richtig) benutzen kann. Wieso?

MFG chewbonaja, was du mit diesem template in einer funktion wie transform kannst, ist, die typen rausfinden.
also zb.template <class A> struct add : binary_function<A,A,A> { A operator () (const A& a, const A& b) { return a+b; } }; template <class Iter, class T> typename T::result_type foobar (Iter a, Iter const& b, T fun) { typename T::result_type tmp; while (a != b) tmp = fun(*a++,tmp); return tmp; } int main () { int a[] = { 2, 3, 5, 8 }; cout << foobar (a, a+4, add<int>()) << endl; }damit foobar also weiß, welchen typ es zurückgeben muss. transform und co. arbeiten natürlich anders, das war jetzt nur ein ganz einfaches beispiel.
-
bei "const int a" als Template Parameter handelt es sich um ein Nontype-Template-Parameter. Bei Google: Non type-Template-Parameter findet man einige Informationen dazu.
Wenn ich hiervon nun eine klasse ableite, den () Operator ueberlade und das ganze in meinetwegen transform reinschmeisse, weiss transform wie es das Funktionsobjekt( Ist das richtig) benutzen kann. Wieso?
Zeiger auf Funktionen rufen die Methode auf indem man sie dereferenziert und wie beim normalen Funktionsaufruf die Parameter übergibt, genauso verhält es sich mit Funktoren. Dafür muss aber ein entsprechender operator() überladen sein. Dieser wird auch für implizite Typumandlungen verwendet.
Greetz