 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Daniel Sch374le Guest
|
Posted: Thu Mar 10, 2005 1:44 am Post subject: template frage |
|
|
hallo zusammen
angenommen folgende Situation
template <typename type>
void bar(type t)
{
cout << "type bar" << endl;
}
template <>
void bar(double d)
{
cout << "d bar" << endl;
}
soweit so gut, aber was wenn man type zu nichts
in der expliciten Überladung definieren will
2 der Ansätze ...
// 1
template <>
void bar<void>()
{
cout << "void bar" << endl;
}
// 2
void bar()
{
cout << "VOID" << endl;
}
Die 1 wird vom Compiler abgewiesen, 2 angenommen.
Allerdings "sieht" für mich die 1 logischer passender
in das template Konzept. Steht im Standard etwas zu diesem Fall
der tempalte Spezialisierung?
MfG
---
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Thu Mar 10, 2005 9:29 am Post subject: Re: template frage |
|
|
Daniel Schüle wrote:
| Quote: | hallo zusammen
angenommen folgende Situation
template <typename type
void bar(type t)
{
cout << "type bar" << endl;
}
template
void bar(double d)
{
cout << "d bar" << endl;
}
|
Was macht das template<> fuer einen Sinn?
Lass es einfach weg.
| Quote: | soweit so gut, aber was wenn man type zu nichts
in der expliciten Überladung definieren will
2 der Ansätze ...
// 1
template
void bar<void>()
{
cout << "void bar" << endl;
}
// 2
void bar()
{
cout << "VOID" << endl;
}
|
Die Syntax, die du da zusammenbastelst, ist der der
partiellen Template Spezialisierung aehnlich. Aber die
gibt es bei Funktionen nicht. Dafuer gibt es schliesslich
Ueberladung.
| Quote: | Die 1 wird vom Compiler abgewiesen, 2 angenommen.
Allerdings "sieht" für mich die 1 logischer passender
in das template Konzept. Steht im Standard etwas zu diesem Fall
der tempalte Spezialisierung?
|
Das sind Funktionen. Hier braucht man keine Template Spezialisierungen.
Deswegen gibt es diese auch nicht.
Und das zweite Beispiel ist simpler, einfacher zu lesen/verstehen
und passt besser in das Funktions-Konzept.
Das erste hingegen wuerde unnoetigen Gebrauch von Templates machen.
MfG,
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Sch374le Guest
|
Posted: Thu Mar 10, 2005 4:31 pm Post subject: Re: template frage |
|
|
Hallo Daniel
| Quote: | template <typename type
void bar(type t)
{
cout << "type bar" << endl;
}
template
void bar(double d)
{
cout << "d bar" << endl;
}
Was macht das template<> fuer einen Sinn?
Lass es einfach weg.
|
Oh ja, die gute alte Frage nach dem Sinn )
Nein im Ernst, es hat schon einen Sinn, wie das
folgende kleine Programm zeigt
*****************
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
template <typename type>
void bar(type t)
{ cout << "type" << endl; }
template <>
void bar<double>(double t)
{ cout << "type d" << endl; }
void bar(double t)
{ cout << "stand alone function" << endl; }
int main()
{
bar
bar<double>(1); // 1 -> double(1)
bar(double(1));
// hier muss parameter convertiert werden, weil sonst bar<int> aufgerufen
wird
return 0;
}
*****************
das zeigt, dass
void bar<double>(double)
void bar(double)
nicht dasselbe sind
| Quote: | soweit so gut, aber was wenn man type zu nichts
in der expliciten Überladung definieren will
2 der Ansätze ...
// 1
template
void bar<void>()
{
cout << "void bar" << endl;
}
// 2
void bar()
{
cout << "VOID" << endl;
}
Die Syntax, die du da zusammenbastelst, ist der der
partiellen Template Spezialisierung aehnlich. Aber die
gibt es bei Funktionen nicht. Dafuer gibt es schliesslich
Ueberladung.
|
ja, das ist klar .. ausserdem würden zu viele Spezialisierungen
Template an sich in Frage stellen
[.. ]
| Quote: | Das sind Funktionen. Hier braucht man keine Template Spezialisierungen.
Deswegen gibt es diese auch nicht.
|
Meinst du Spezialisierung oder Instanzierung?
Aber meineswissens gibt es doch beide.
Funktionsspezialisierungen habe ich oben im Programm benutzt
und instanziert werden die auch. (sonst wäre es dieselbe Funktion)
Und jede Instanzierung würde in jeder Übersetzungseiheit Platz beanspruchen,
auch dann wenn in allen Übersetzungseinheiten nur
instanziert wurde (sogenanntes code bloat)
| Quote: | Und das zweite Beispiel ist simpler, einfacher zu lesen/verstehen
und passt besser in das Funktions-Konzept.
|
das ist mehr eine Ansichtssache
ich finde mit "template <>" ausdrucksvoller, schliesslich
kann man so etwas machen
template <typename type>
void foo(){ type t; }
foo<int>();
foo<unsigned int>();
das ist mit Überladungen nicht möglich, und in diesem Fall *muss* man sogar
template <>
void foo<double>{}
benutzen, um eine Spezialisierung hinzubekommen.
warum <void> nicht geht, leuchtet mir jetzt aber ein
würde irgendwo
{ /**/type t; /**/}
stehen, würde es keinen Sinn machen
MfG
--
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|