<?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[Stringkosntante: Länge zur Compile-Zeit]]></title><description><![CDATA[<p>Ich habe eine Klasse:</p>
<pre><code class="language-cpp">class str
{
   char const * beg; 
   char const * end;   

public:
   str(char const * p) : beg(p), end(p+strlen(p)) {}
};
</code></pre>
<p>gibt es eine Möglichkeit, sich das strlen zur Laufzeit zu sparen, wenn str mit einer Stringkonstante initialisiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154721/stringkosntante-länge-zur-compile-zeit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 00:35:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154721.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Jul 2006 21:48:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 21:48:02 GMT]]></title><description><![CDATA[<p>Ich habe eine Klasse:</p>
<pre><code class="language-cpp">class str
{
   char const * beg; 
   char const * end;   

public:
   str(char const * p) : beg(p), end(p+strlen(p)) {}
};
</code></pre>
<p>gibt es eine Möglichkeit, sich das strlen zur Laufzeit zu sparen, wenn str mit einer Stringkonstante initialisiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106909</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sat, 29 Jul 2006 21:48:02 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:06:42 GMT]]></title><description><![CDATA[<p>der typ eines stringliterals ist array aus konstatem char/wchar_t. folglich läßt sich die länge des strings aus der größe des arrays ermitteln.</p>
<pre><code class="language-cpp">class str
{
   char const * beg;
   char const * end;  

public:
    template&lt;std::size_t N&gt;
    str(const char(&amp;str)[N]) : beg(str), end(str+N-1) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1106911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106911</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:19:22 GMT]]></title><description><![CDATA[<p>Wenn ich beide Konstruktoren angebe, nimmt mein compiler immer den str(TCHAR const <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="😉"
    /> - und den brauch' ich für nicht-Konstanten. Gibt's da noch 'ne trick?</p>
<p>Ich könnte das aber über eine Hilfsklasse/Funktion nutzen - reicht ja auch <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/1106915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106915</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:33:55 GMT]]></title><description><![CDATA[<p>Also an und für sich sollte das schon so gehen. Wichtig ist nur, dass die Variable auch ein Array ist sonst funktioniert das nicht.</p>
<p>Angenommen deine Konstruktoren sehen so aus:</p>
<pre><code class="language-cpp">// Konstruktor 1
    str(char const * s): beg(s), end(s + strlen(s)) {}

    // Konstruktor 2
    template&lt;std::size_t N&gt;
    str(const char(&amp;sa)[N]) : beg(sa), end(sa+N-1) {}
</code></pre>
<pre><code class="language-cpp">char const * foo = &quot;BlubberBlaFoo&quot;; 

str foo_str(foo); //Konstruktor 1

char bar[] = &quot;Sonstwas&quot;;

str bar_str(bar); // Konstruktor 2
</code></pre>
<p>Wenn das zur Kompilierzeit bestimmt werden soll, muss es ein Array sein. Aus einem char const* kann die Länge nicht zur Kompilierzeit bestimmt werden.</p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106918</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:35:39 GMT]]></title><description><![CDATA[<p>mach aus dem anderen konstruktor auch ein template, wobei ungültige typen per SFINAE unterdrückt werden:</p>
<pre><code class="language-cpp">#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits.hpp&gt;
class str
{
   char const * beg;
   char const * end;  

public:
    template&lt;typename T&gt;
    str(T p, typename boost::enable_if_c&lt;
            boost::is_same&lt; T, const char* &gt;::value || boost::is_same&lt; T, char* &gt;::value
        &gt;::type* = 0)
        : beg(p), end(p+strlen(p)) {}
    template&lt;std::size_t N&gt;
    str(const char(&amp;str)[N]) : beg(str), end(str+N-1) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1106919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106919</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:38:44 GMT]]></title><description><![CDATA[<p>Für str(&quot;xyz&quot;);</p>
<p>nimmt MSVC8 Konstruktor 1.</p>
<p>Mit:</p>
<pre><code class="language-cpp">template&lt;size_t len&gt; inline 
str strc(const char (&amp;s)[len])  
{ 
   return str(s,s+len-1);  
}
</code></pre>
<p>geht auch strc(&quot;xyz&quot;) - das reicht mir schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106920</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Stringkosntante: Länge zur Compile-Zeit on Sat, 29 Jul 2006 22:51:54 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Konstruktor 1
    str(char const * s): beg(s), end(s + strlen(s)) {}

    // Konstruktor 2
    template&lt;std::size_t N&gt;
    str(const char(&amp;sa)[N]) : beg(sa), end(sa+N-1) {}
</code></pre>
</blockquote>
<p>konstruktor 1 benötigt hier nur eine array-zu-pointer-konvertierung für array argumente und ist folglich ein &quot;exact match&quot; und damit immer besser als jede funktionstemplatespezialisierung. konstruktor 2 kann hier nie durch argument deduktion aufgerufen werden. indem der erste konstruktor in einen template konstruktor umgewandelt wird, wird diese problematik umgangen: einerseits werden für argumente, für die der parametertyp durch deduktion ermittelt werden, keine implizite konvertierungssequenzen angewandt und zweitens wäre dieser konstruktor auch nicht mehr automatisch dem anderen vorzuziehen, selbst wenn eine passende spezialisierung existieren würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106923</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 29 Jul 2006 22:51:54 GMT</pubDate></item></channel></rss>