<?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-Überladung für Arraylänge]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;size_t N&gt;
size_t arrlen(const char (&amp;arr)[N]) { std::cout &lt;&lt; &quot;array: &quot;; return N; }
size_t arrlen(const char *arr) { std::cout &lt;&lt; &quot;pointer: &quot;; return 1+strlen(arr); }

int main()
{
  const char buf[] = &quot;abc&quot;;
  std::cout &lt;&lt; arrlen(buf) &lt;&lt; '\n';
}
</code></pre>
<p>Ausgabe: &quot;pointer: 4&quot;.</p>
<p>Krieg ich irgendwie hin, dass die erste Funktion aufgerufen wird? Es ist auch gewollt, dass das Verhalten unterschiedlich ist, wenn das Array Nullen enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299606/template-überladung-für-arraylänge</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 03:19:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299606.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Feb 2012 21:32:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:32:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;size_t N&gt;
size_t arrlen(const char (&amp;arr)[N]) { std::cout &lt;&lt; &quot;array: &quot;; return N; }
size_t arrlen(const char *arr) { std::cout &lt;&lt; &quot;pointer: &quot;; return 1+strlen(arr); }

int main()
{
  const char buf[] = &quot;abc&quot;;
  std::cout &lt;&lt; arrlen(buf) &lt;&lt; '\n';
}
</code></pre>
<p>Ausgabe: &quot;pointer: 4&quot;.</p>
<p>Krieg ich irgendwie hin, dass die erste Funktion aufgerufen wird? Es ist auch gewollt, dass das Verhalten unterschiedlich ist, wenn das Array Nullen enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181253</guid><dc:creator><![CDATA[adler]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:45:01 GMT]]></title><description><![CDATA[<p>Einfache Variante:</p>
<pre><code class="language-cpp">template&lt; class = int &gt;
size_t arrlen(const char *arr ) { std::cout &lt;&lt; &quot;pointer: &quot;; return 1+std::strlen(arr); }
</code></pre>
<p>Da auch die pointer Version ein template ist wird sie bei Überladung nicht mehr bevorzugt. Alternativ kann man die pointer Version auch anders zu einem schlechteren match machen als die mit array:</p>
<pre><code class="language-cpp">struct conv_incl
{
    conv_incl( const char *arr_ )
    {
        arr = arr_;
    }
    const char *arr;
};
size_t arrlen( conv_incl c ) { std::cout &lt;&lt; &quot;pointer: &quot;; return 1+std::strlen( c.arr ); }
</code></pre>
<p>Vermutlich kann man das auch mit enable_if und type_traits machen, aber das ist umständlicher denk ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181256</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:48:56 GMT]]></title><description><![CDATA[<p>Fällt dir nichts auf? <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="😃"
    /><br />
Schreib mal</p>
<pre><code class="language-cpp">arrlen&lt;4&gt;(buf);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2181257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181257</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:49:29 GMT]]></title><description><![CDATA[<p>Dieser Name-Lookup in C++ ist wirklich verzwickt.</p>
<p>Aber danke dir, GorbGorb, du hast mir sehr geholfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181259</guid><dc:creator><![CDATA[adler]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:52:07 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Fällt dir nichts auf? <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="😃"
    /></p>
</blockquote>
<p>Doch, das ist mir schon aufgefallen (es beweist, dass die Funktion prinzipiell stimmt). Nützt mir nur nichts, weil wenn ich die Länge schon hätte, bräuchte ich dafür doch keine Funktion <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2181260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181260</guid><dc:creator><![CDATA[adler]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 21:54:18 GMT]]></title><description><![CDATA[<p>adler schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Fällt dir nichts auf? <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="😃"
    /></p>
</blockquote>
<p>Doch, das ist mir schon aufgefallen (es beweist, dass die Funktion prinzipiell stimmt). Nützt mir nur nichts, weil wenn ich die Länge schon hätte, bräuchte ich dafür doch keine Funktion <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>
</blockquote>
<p>Dann <strong>mach</strong> doch nicht so eine Funktion? Wofür brauchst du das überhaupt? Merke: Hier im Forum hilft man bei deinem Haupt-Problem, nicht bei den Problemen die entstanden als deine C++-Einschränkungen ins Spiel kamen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181261</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 14 Feb 2012 21:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 22:05:46 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Merke: Hier im Forum hilft man bei deinem Haupt-Problem, nicht bei den Problemen die entstanden als deine C++-Einschränkungen ins Spiel kamen.</p>
</blockquote>
<p>Ihm wurde schon längst geholfen. Mit deinem Beispiel zeigst du eigentlich nur, dass du die Funktion nicht verstanden hast. Sie taucht öfter hier im Forum auf. Such einfach mal danach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181264</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 14 Feb 2012 22:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Tue, 14 Feb 2012 22:17:55 GMT]]></title><description><![CDATA[<p>Ja Hacker glänzt heute wieder besonders.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@Topic</a>: Array-Länge ist eine Sache, wo ich immer noch nen Makro verwende. Das funktioniert nämlich auch mit älteren Compilern, und mit allen möglichen und unmöglichen Typen (internal linkage etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181266</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 14 Feb 2012 22:17:55 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 01:54:23 GMT]]></title><description><![CDATA[<p>Mal aus Interesse: In welchem Zusammenhang braucht man &quot;eine&quot; Funktion, die sich einmal wie strlen() + 1, und einmal wie sizeof(a)/sizeof(*a) verhält? Das sind in meinen Augen zwei _völlig_ unterschiedliche Dinge - die ich nicht nur aus Designgründen nicht mischen würde, sondern für die mir auch kein gemeinsamer Anwendungsfall einfällt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181277</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 15 Feb 2012 01:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 07:23:41 GMT]]></title><description><![CDATA[<p>Also deine template built-ins machen nur Sinn, wenn es einen Grund gäbe, dass das N vor der Laufzeit (also zur Compilezeit) bekannt sein sollte. Gründe dafür hat deine Funktion eigentlich keine. Ja aus einem Pointer kann man nicht mehr rauslesen wie viele Elemente darin enthalten sind, aber dafür kannst du z.B. vector oder einfach einen string benutzen und schon liefert das Objekt die zusätzlichen Funktionen. Ansonsten musst du halt die Länge als separate Parameter übergeben wie es die komplette CRT macht! memset(..,..., Länge), memcpy(..,.., Länge).<br />
Wenn du mit zero-terminierten chars arbeitest(wie in deinem Beispiel) funktioniert strlen(chars) natürlich genauso und du brauchst keine zusätzlichen Parameter.</p>
<p>Aber diese built-ins sollten eher für zur Entwicklungszeit unbekannte, aber dann zur Compilezeit bekannten Datenlängen vom Stack benutzt werden. z.B.<br />
template&lt;int R, int C&gt;class Matrix;</p>
<p>oder für zeitkritischen inline Code z.B.<br />
template&lt;unsigned int&gt;struct Fakulitaet;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181295</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Wed, 15 Feb 2012 07:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 11:46:08 GMT]]></title><description><![CDATA[<p>Hier noch eine exotische Variante (ich würde aber nicht darauf vertrauen, dass das jeder Compiler richtig hinbekommt):</p>
<pre><code class="language-cpp">size_t arrlen(const volatile char *arr) { std::cout &lt;&lt; &quot;pointer: &quot;; return 1+strlen(const_cast&lt;const char*&gt;(arr)); }
</code></pre>
<p>(Sollte nat. nicht mit volatile-Objekten verwendet werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181387</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 15 Feb 2012 11:46:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 12:44:44 GMT]]></title><description><![CDATA[<p>Mir ist klar, dass 'N' erst zur Laufzeit berechnet wird und man es bei solchen Konstrukten nicht anzugeben braucht.</p>
<p>Edit: Zu meinem Beispiel: war als Scherz gemeint <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="😃"
    /> , ich meinte er kann die Länge als Template-Parameter explizit angeben und dadurch den Aufruf der entsprechenden Funktion erzwingen. Kam schlecht an, fürchte ich. Die Fragestellung war mir zu ungenau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181425</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 15 Feb 2012 12:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 13:11:23 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Zu meinem Beispiel: war als Scherz gemeint <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="😃"
    /></p>
</blockquote>
<p>rofl, ich lach mich schlapp <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="😃"
    /> <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="😃"
    /> <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181448</guid><dc:creator><![CDATA[loli]]></dc:creator><pubDate>Wed, 15 Feb 2012 13:11:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 13:40:56 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Mir ist klar, dass 'N' erst zur Laufzeit berechnet wird.</p>
</blockquote>
<p>Überleg besser nochmal, wie das mit den Templates zur Laufzeit war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181464</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 15 Feb 2012 13:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Überladung für Arraylänge on Wed, 15 Feb 2012 16:03:00 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Mir ist klar, dass 'N' erst zur Laufzeit berechnet wird.</p>
</blockquote>
<p>Überleg besser nochmal, wie das mit den Templates zur Laufzeit war.</p>
</blockquote>
<p>Dann Compile-Zeit (meinte ich ja). Es heißt ja so schön &quot;Template-<em>meta programmierung</em>&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181527</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 15 Feb 2012 16:03:00 GMT</pubDate></item></channel></rss>