C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

template frage

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Daniel Sch374le
Guest





PostPosted: Thu Mar 10, 2005 1:44 am    Post subject: template frage Reply with 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;
}

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





PostPosted: Thu Mar 10, 2005 9:29 am    Post subject: Re: template frage Reply with quote



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





PostPosted: Thu Mar 10, 2005 4:31 pm    Post subject: Re: template frage Reply with quote



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 Wink)
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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.