Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Templatefunktionen für bestimmte Typen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.10.2004, 17:25 Uhr
~The_December
Gast


Hallo,

gibt es die Möglichkeit bestimmte Templatefunktionen nur für einen Type zu schreiben? Zum Beispiel nur eine Instanz vom Type int soll auch die Funktion asdf() benutzen können. Eine Instanz vom Type float würde diese Funktion erst gar nicht sehen.

Mfg
The_December
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.10.2004, 18:25 Uhr
Devil



Du kannst Template(member)funktionen spezialsieren.


C++:
template<class T>
T mytemp(T *foo)
{
/*tuwas*/
return *foo;
}

template<int>
int mytemp(int *foo)
{
/*tuwas*/
*foo +=2;
return *foo;
}


Ansonsten, wenn es nur für einen Typen sein soll, für was dann ein Template ?

Devil
--
Intelligenz ist eine Illusion des Menschen

Dieser Post wurde am 25.10.2004 um 18:26 Uhr von Devil editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.10.2004, 09:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Einen Anwendungsfall kann ich mir eigentlich nur in folgenden Situationen vorstellen: man hat nette Templatefunktionen geschrieben und die tun es eben nur für integer typen, für Fließkomma zahlen sind sie sinnlos.

Im folgenden Beipiel gibt es zB eine Templatefunktion namen fac. Da wir hier nur die einfache art der Fakultät berechnen wollen, wollen wir eigentlich nicht in die Situation kommen, daß dieses Template für nicht integrale typen benutzt wird:

C++:
#include <limits>

// Vereinfachte Fakultaetsberechnung,
// läßt sich nur for integrale Typen instanziieren
template<typename I>
I fac(I n) {
   typedef char type_is_exact_guard[std::numeric_limits<I>::is_exact];
   return n? n*fac(n-1):1;
}

int main()
{
        fac<int>(10);
        fac<float>(10); // FEHLER!
}



Und tatsächlich sollte der Compiler bei der Zeile, die mit "FEHLER!" markiert ist, einen Fehler werfen.

Das Prinzip ist eigentlich einfach: man bildet typen, meist arrays in der Funktion. Ist die bedingung erfüllt (in Abh. von den Templateparametern), ist die Array dimension >0, ist sie nicht erfüllt, wird die Dimension <=0, was einen Compilerfehler verursacht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.10.2004 um 09:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.10.2004, 13:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
da man gar nicht weiss was std::numeric_limits<I>::is_exact zurückliefert kann dir das teil doch zum einen schön den speicher zumüllen und die performance in keller schieben und durch den rekusiven aufruf den stack crashen oder irre ich mich?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.10.2004 um 13:15 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.10.2004, 14:05 Uhr
virtual
Sexiest Bit alive
(Operator)


@windalf

1. std::numeric_limits<i>::is_exact ist ne konstante, wie Dir vermutlich die Notattion nahelegt - daher wird das bereits zu compile Zeit aufglöst.

2. std::numeric_limits<i>::is_exact is ein bool. Jetzt und immer und egal, welches I du verwendest. Manchmal ists eben true, manchmal false. Das ist der einzige unterschied.

3. Ich habe ein typedef verwendet, das kostet 0.0 Bits speicher im Executable, und genausoviele Nanosekunden Laufzeit.

Ich finds okay.

Bearbeitung:

Das einzige, wo ich mir augenblicklich och unsicher bin, ob das std::numeric_limits<i>::is_exact vom bool zu einem int-Typen gecastet werden muß, um komplett ISO zu sein, aber ich mein, daß an dieser Stelle ein bool auch in ein int promoviert wird


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.10.2004 um 14:11 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: