<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Template Funktionen - Korrektur?]]></title><description><![CDATA[<p>Ersteinmal Hallo an alle, hab mich so eben frisch registriert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich höre zur Zeit C++ für Fortgeschrittene an meiner Uni. Heute am ersten Tag ging es außschließlich um Templates. Wir bekamen die Aufgabe:</p>
<blockquote>
<p>a) Schreiben Sie Funktionen length(str) und charAt(str, i), mit denen man die<br />
Länge bzw. das i-te Zeichen eines Strings str ermitteln kann, und zwar sowohl<br />
für Strings der Standard-Bibliothek (basic_string) als auch für 0-terminierte char<br />
arrays (&quot;c-style Strings&quot;).</p>
<p>b) Schreiben Sie ein einzelnes Funktions-Template printRev(str), das unter<br />
Verwendung von length(str) und charAt(str, i) einen String str rückwärts<br />
ausgibt.</p>
</blockquote>
<p>An sich hätte ich Überladen verwendet, da es aber nur um Templates ging, hab ich es also mit desgleichen gelöst:</p>
<p><a href="http://codepad.org/0sCv9cat" rel="nofollow">http://codepad.org/0sCv9cat</a></p>
<p>Es funktioniert zwar soweit alles - aber ich hab heute zum ersten Mal mich mit Templates beschäftigt, kenne nur Generics aus Java.</p>
<p>Könnte jemand mal rübergucken, ob das vernünftig realisiert ist?</p>
<p>Würde mich sehr freuen,</p>
<p>BrokenClockwork <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264347/template-funktionen-korrektur</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 19:00:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264347.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Apr 2010 14:33:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 14:33:24 GMT]]></title><description><![CDATA[<p>Ersteinmal Hallo an alle, hab mich so eben frisch registriert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich höre zur Zeit C++ für Fortgeschrittene an meiner Uni. Heute am ersten Tag ging es außschließlich um Templates. Wir bekamen die Aufgabe:</p>
<blockquote>
<p>a) Schreiben Sie Funktionen length(str) und charAt(str, i), mit denen man die<br />
Länge bzw. das i-te Zeichen eines Strings str ermitteln kann, und zwar sowohl<br />
für Strings der Standard-Bibliothek (basic_string) als auch für 0-terminierte char<br />
arrays (&quot;c-style Strings&quot;).</p>
<p>b) Schreiben Sie ein einzelnes Funktions-Template printRev(str), das unter<br />
Verwendung von length(str) und charAt(str, i) einen String str rückwärts<br />
ausgibt.</p>
</blockquote>
<p>An sich hätte ich Überladen verwendet, da es aber nur um Templates ging, hab ich es also mit desgleichen gelöst:</p>
<p><a href="http://codepad.org/0sCv9cat" rel="nofollow">http://codepad.org/0sCv9cat</a></p>
<p>Es funktioniert zwar soweit alles - aber ich hab heute zum ersten Mal mich mit Templates beschäftigt, kenne nur Generics aus Java.</p>
<p>Könnte jemand mal rübergucken, ob das vernünftig realisiert ist?</p>
<p>Würde mich sehr freuen,</p>
<p>BrokenClockwork <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878361</guid><dc:creator><![CDATA[BrokenClockwork]]></dc:creator><pubDate>Tue, 06 Apr 2010 14:33:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 14:53:17 GMT]]></title><description><![CDATA[<p>Ja finde ich persönlich gut gelöst, hätte daran eigentlich nichts auszusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878372</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 06 Apr 2010 14:53:17 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 14:57:48 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht ganz, weshalb du so einen komplizierten Umweg über die <code>Value</code> -Struktur gehst und dann trotzdem wieder Überladung verwendest. Templates sind ein anderes Konzept. Für <code>charAt()</code> kannst du noch generisch arbeiten, bei <code>length()</code> musst du hingegen Fälle unterscheiden. Da wäre Überladung um Längen sinnvoller gewesen, aber mit Template-Spezialisierung kann man das auch hinbiegen. Nur muss man die willkürliche Entscheidung treffen, welches der allgemeine und welches der spezielle Fall ist.</p>
<p>Das Funktionstemplate <code>charAt()</code> hätte ich so implementiert:</p>
<pre><code class="language-cpp">template &lt;typename StringType&gt;
char charAt(const StringType&amp; str, unsigned int i)
{
    return str[i];
}
</code></pre>
<p>Wichtig ist auch, dass du beim Aufruf die Typen nicht explizit angibst, denn dann gewinnst du eigentlich nichts gegenüber zwei benannten Funktionen. Der Compiler kann den Typ des Arguments herleiten. Also</p>
<pre><code class="language-cpp">charAt(a,0)
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">charAt&lt;string&gt;(a,0)
</code></pre>
<p>Und füge doch nächstes Mal Code direkt hier ins Forum ein. Dazu gibts die [cpp]-Tags (erste weisse Schaltfläche mit Aufschrift &quot;C/C++&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878373</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Apr 2010 14:57:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 14:56:34 GMT]]></title><description><![CDATA[<p>Geht es nicht um Spezialisierung von Funktionstemplates?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878375</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Tue, 06 Apr 2010 14:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 15:01:41 GMT]]></title><description><![CDATA[<p>Gut, kann man so oder so sehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Aber jetzt wo ein bisschen Kritik kommt, hab ich den Code auch mal in meine IDE reingeworfen und mein Compiler meckert sogar bei</p>
<pre><code class="language-cpp">char charAt(typename Value&lt;TString&gt;::CString s, int i)
//
int length(typename Value&lt;TString&gt;::CString s)
</code></pre>
<p>Das <em>typename</em> und <em>::CString</em> gefällt ihm nicht. Was benutzt du denn für eine Entwicklungsumgebung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878377</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 06 Apr 2010 15:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 15:11:36 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>Geht es nicht um Spezialisierung von Funktionstemplates?</p>
</blockquote>
<p>Scheint so, aber dafür ist die Aufgabenstellung ziemlich schlecht. Abgesehen davon ist Spezialisierung bei Funktionstemplates ohnehin eine fragwürdige Angelegenheit. In vielen Fällen ist Überladung besser geeignet (weil flexibler) und erspart Überraschungen, was das Auswahlverfahren der richtigen Funktion betrifft.</p>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Aber jetzt wo ein bisschen Kritik kommt, hab ich den Code auch mal in meine IDE reingeworfen und mein Compiler meckert sogar bei [...]</p>
</blockquote>
<p>Darum geht es doch nicht. Das Problem ist, dass Templates falsch verstanden und eingesetzt werden. Oder kannst du mir verraten, welchen Sinn das <code>T</code> bei <code>Value</code> hat? Hier liegt eine völlig falsche Herangehensweise vor. Als Lektüre sei mal <a href="http://magazin.c-plusplus.net/artikel/Einf%FChrung%20in%20die%20Programmierung%20mit%20Templates" rel="nofollow">dieser Artikel</a> erwähnt.</p>
<p>Hier ist übrigens der Originalcode kopiert, um ihn länger zu erhalten und den Helfern das Link-Anklicken zu ersparen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;

using std::string;

/* Exercise 1.a */
template &lt;typename T&gt;
struct Value
{
	typedef char CString[];
	typedef string CppString;
};

template &lt;typename TString&gt;
int length(typename Value&lt;TString&gt;::CppString s)
{
	return s.length();
}

template &lt;typename TString&gt;
char charAt(typename Value&lt;TString&gt;::CppString s, int i)
{
	return s[i];
}

template &lt;typename TString&gt;
int length(typename Value&lt;TString&gt;::CString s)
{
	return strlen(s);
}

template &lt;typename TString&gt;
char charAt(typename Value&lt;TString&gt;::CString s, int i)
{
	return s[i];
}

/* Exercise 1.b */

template &lt;typename TString&gt;
TString printRev(string s)
{
	string result(s.begin(), s.end());

	reverse(result.begin(), result.end());

	return result;
}

/* main() for test purposes */

int main()
{

	string a = &quot;Hello Berlin&quot;;
	char b[] = &quot;Hello Berlin again&quot;;

	std::cout &lt;&lt; length&lt;string&gt;(a) &lt;&lt; std::endl;
	std::cout &lt;&lt; length&lt;char[]&gt;(b) &lt;&lt; std::endl;

	std::cout &lt;&lt; charAt&lt;string&gt;(a,0) &lt;&lt; std::endl;
	std::cout &lt;&lt; charAt&lt;char[]&gt;(b,1) &lt;&lt; std::endl;

	std::cout &lt;&lt; printRev&lt;string&gt;(a) &lt;&lt; std::endl;
	std::cout &lt;&lt; printRev&lt;string&gt;(b) &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1878381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878381</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Apr 2010 15:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 15:37:28 GMT]]></title><description><![CDATA[<p>Ich hätte irgendwie an sowas gedacht:<br />
(const und Refrenzen soweit möglich absichtlich weggelassen)</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;cstring&gt;
using namespace std;

//Anmelden, daß es length gibt
template &lt;typename STRING&gt;
int length(STRING str);

//Geht für s1 und s2
template&lt;&gt;
int length(char* str){
	return strlen(str);
}

//Spaßige Optimierung für s1, brauchen wir gar nicht
template&lt;int SIZE&gt;
int length(char (&amp;str)[SIZE]){
	return SIZE-1;
}

//geht für s3
template&lt;&gt;
int length(string str){
	return str.length();
}

int main()
{
	char s1[]=&quot;hallo&quot;;
	char* s2=&amp;s1[1];
	string s3=&quot;c++&quot;;
	cout&lt;&lt;length(s1)&lt;&lt;'\n';
	cout&lt;&lt;length(s2)&lt;&lt;'\n';
	cout&lt;&lt;length(s3)&lt;&lt;'\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1878398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878398</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 06 Apr 2010 15:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 15:43:39 GMT]]></title><description><![CDATA[<p>Danke ersteinmal für die vielen Antworten. Ja Nexux, ich finde Überladen auch besser und ich denke auch das die Aufgabenstellung schlecht formuliert ist.</p>
<p>Ich habe mal meine neue Version angefügt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;

using std::string;

/* Exercise 1.a */
template &lt;typename T&gt;
struct Value
{
	typedef char CString[];
	typedef string CppString;
};

template &lt;typename TString&gt;
int length(typename Value&lt;TString&gt;::CppString s)
{
	return s.length();
}

template &lt;typename TString&gt;
int length(typename Value&lt;TString&gt;::CString s)
{
	return strlen(s);
}

template &lt;typename TString&gt;
char charAt(const TString &amp;s, unsigned int i)
{
	return s[i];
}

/* Exercise 1.b */

template &lt;typename TString&gt;
string printRev(const TString &amp;s)
{
	string result(length&lt;TString&gt;(s), ' ');

	int l = length&lt;TString&gt;(s);

	for (int i = 0; i != l; ++i)
	{
		result[i] = charAt(s,l-i-1);
	}

	return result;	
}

/* main() for test purposes */

int main()
{

	string a = &quot;Hello Berlin&quot;;
	char b[] = &quot;Hello Berlin again&quot;;

	std::cout &lt;&lt; length&lt;string&gt;(a) &lt;&lt; std::endl;
	std::cout &lt;&lt; length&lt;char[]&gt;(b) &lt;&lt; std::endl;

	std::cout &lt;&lt; charAt(a,0) &lt;&lt; std::endl;
	std::cout &lt;&lt; charAt(b,1) &lt;&lt; std::endl;

	std::cout &lt;&lt; printRev(a) &lt;&lt; std::endl;
	std::cout &lt;&lt; printRev(b) &lt;&lt; std::endl;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1878403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878403</guid><dc:creator><![CDATA[BrokenClockwork]]></dc:creator><pubDate>Tue, 06 Apr 2010 15:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 15:50:36 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das Problem ist, dass Templates falsch verstanden und eingesetzt werden. Oder kannst du mir verraten, welchen Sinn das <code>T</code> bei <code>Value</code> hat?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> ... Du hast natürlich Recht, das hab ich völlig übersehen.</p>
<p>BrokenClockwork schrieb:</p>
<blockquote>
<p>Ich habe mal meine neue Version angefügt.</p>
</blockquote>
<p>Der Fehler ist immer noch da. Du benutzt ein Template bei deiner Struktur, obwohl dies überhaupt kein Sinn macht, denn du nutzt es garnicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878405</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 06 Apr 2010 15:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template Funktionen - Korrektur? on Tue, 06 Apr 2010 16:14:10 GMT]]></title><description><![CDATA[<p>Ach jetzt seh ich erst was gemeint ist, das ist wirklich grässlich... keine Ahnung wie man das mit Templates und eben nicht Überladen realisiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Edit: Naja schlussendlich ähnlich wie Volkard, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878409</guid><dc:creator><![CDATA[BrokenClockwork]]></dc:creator><pubDate>Tue, 06 Apr 2010 16:14:10 GMT</pubDate></item></channel></rss>