<?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[[C++0x] Stringliterale &amp;amp; Templates]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>ich habe vor kurzem im Zusammenhang mit der Definition von benutzerdefinierten Stringliteralen in C++0x folgendes Konstrukt gesehen:</p>
<pre><code class="language-cpp">template&lt;char...&gt; SomeType operator &quot;&quot; BenutzerSuffix();

&quot;123&quot;BenutzerSuffix   // ruft operator&quot;&quot; BenutzerSuffix&lt;'1','2','3'&gt;() auf
</code></pre>
<p>(siehe auch: <a href="http://en.wikipedia.org/wiki/C%2B%2B0x#User-defined_literals" rel="nofollow">http://en.wikipedia.org/wiki/C%2B%2B0x#User-defined_literals</a>)</p>
<p>Meine Frage hierzu: Ist diese Art der &quot;speziellen&quot; Templateinstantiierung speziell für den operator &quot;&quot; vorgesehen oder lässt sich nun auch folgendes machen:</p>
<pre><code class="language-cpp">template&lt;char ...&gt;
struct foo{
   //
};

foo&lt;&quot;abc&quot;&gt; bar;
</code></pre>
<p>? Bisher konnte ich jedenfalls noch keinen Hinweis darauf entdecken, dass dies der Fall sein könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271849/c-0x-stringliterale-amp-templates</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 06:11:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271849.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Aug 2010 00:31:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [C++0x] Stringliterale &amp;amp; Templates on Thu, 05 Aug 2010 00:31:13 GMT]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>ich habe vor kurzem im Zusammenhang mit der Definition von benutzerdefinierten Stringliteralen in C++0x folgendes Konstrukt gesehen:</p>
<pre><code class="language-cpp">template&lt;char...&gt; SomeType operator &quot;&quot; BenutzerSuffix();

&quot;123&quot;BenutzerSuffix   // ruft operator&quot;&quot; BenutzerSuffix&lt;'1','2','3'&gt;() auf
</code></pre>
<p>(siehe auch: <a href="http://en.wikipedia.org/wiki/C%2B%2B0x#User-defined_literals" rel="nofollow">http://en.wikipedia.org/wiki/C%2B%2B0x#User-defined_literals</a>)</p>
<p>Meine Frage hierzu: Ist diese Art der &quot;speziellen&quot; Templateinstantiierung speziell für den operator &quot;&quot; vorgesehen oder lässt sich nun auch folgendes machen:</p>
<pre><code class="language-cpp">template&lt;char ...&gt;
struct foo{
   //
};

foo&lt;&quot;abc&quot;&gt; bar;
</code></pre>
<p>? Bisher konnte ich jedenfalls noch keinen Hinweis darauf entdecken, dass dies der Fall sein könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936383</guid><dc:creator><![CDATA[Matzer]]></dc:creator><pubDate>Thu, 05 Aug 2010 00:31:13 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Stringliterale &amp;amp; Templates on Thu, 05 Aug 2010 18:46:01 GMT]]></title><description><![CDATA[<p>Mich wundert diese Template-Schreibweise auch, allerdings muss man zuerst einmal sagen, dass dieses Beispiel in Wikipedia für numerale Datentypen wie float da steht!<br />
Was mich konkret am Template wundert:<br />
Wie werden die Daten übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936749</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 05 Aug 2010 18:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Stringliterale &amp;amp; Templates on Thu, 05 Aug 2010 19:06:51 GMT]]></title><description><![CDATA[<p>operator &quot;&quot; steht für eine Literal ohne Type</p>
<p>operator &quot;&quot; (double) für Doubleliterale<br />
operator &quot;&quot; (char <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="😉"
    /> für Stringliterale</p>
<p>Außerdem kann ich an mein Literal ein beliebiger Suffix angeben.</p>
<p>#pragma print(x) als Anweisung, dass der Compiler eine Ausgabe schreibt.</p>
<pre><code class="language-cpp">void operator &quot;&quot; _Out(char* literal) {
#pragma print(literal)
}

void operator &quot;&quot; _Out(double literal) {
#pragma print(literal)
}

int main() 
{
   &quot;Hello World&quot;_Out; // Hello World in Compileroutput
   3.12145587788_Out; // 3.12145587788 in Compileroutput
}
</code></pre>
<p>Den Trick mit den Char Variadic template muss ich mir noch ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936755</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Thu, 05 Aug 2010 19:06:51 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Stringliterale &amp;amp; Templates on Fri, 06 Aug 2010 12:40:11 GMT]]></title><description><![CDATA[<p>Matzer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;char...&gt; SomeType operator &quot;&quot; BenutzerSuffix();

&quot;123&quot;BenutzerSuffix   // ruft operator&quot;&quot; BenutzerSuffix&lt;'1','2','3'&gt;() auf
</code></pre>
</blockquote>
<p>Dieser Operator passt nicht zu der Literal-Syntax. Das Literal ist ein sogenanntes &quot;user defined string literal&quot;. Als solches kommen die über char... templatisierten Literal-Operatoren <strong>nicht</strong> in Frage. Die richtige Syntax für Deinen Operator ist diese hier:</p>
<pre><code class="language-cpp">SomeType a = 12345BenutzerSuffix; // benutzer-definiertes Integer-Literal
SomeType b =   007BenutzerSuffix; // benutzer-definiertes Integer-Literal
SomeType c = 0x333BenutzerSuffix; // benutzer-definiertes Integer-Literal
SomeType d = 1.314BenutzerSuffix; // benutzer-definiertes Float-Literal
SomeType e = 4.2e1BenutzerSuffix; // benutzer-definiertes Float-Literal
</code></pre>
<p>wobei diese, sofern keine anderen Operatoren definiert wurden, als Aufrufe</p>
<pre><code class="language-cpp">operator&quot;&quot;BenutzerSuffix&lt;'1','2','3','4','5'&gt;()
operator&quot;&quot;BenutzerSuffix&lt;'0','0','7'&gt;()
operator&quot;&quot;BenutzerSuffix&lt;'0','x','3','3','3'&gt;()
// etc
</code></pre>
<p>aufgefasst werden. Die anderen Operatoren (falls vorhanden) hätten allerdings höhere Priorität. Also, Wenn Du zB noch operator&quot;&quot;BenutzerSuffix(double) deklariert hättest, dann würden die letzten beiden Literale diesen Operator aufrufen.</p>
<p>Dass die &quot;rohen&quot; Zeichen vor dem Suffix zu Template-Parametern übersetzt werden können, ist eine spezielle Regel bei der Literal-Syntax. Dein Beispiel mit foo&lt;&quot;123&quot;&gt; wird nicht funktionieren.</p>
<p>Allerdings frage ich mich gerade, was passiert, wenn ein benutzerdefinierter Suffix mit einem Zeichen anfängt, welches noch zu einem Integer- oder Float-Literal gehören könnte. ZB 0x333BenutzerSuffix. Das könnte man jetzt auf zwei Arten zerlegen:</p>
<pre><code>0x333 BenutzerSuffix
0x333B enutzerSuffix
</code></pre>
<p>Vielleicht ist diese Ambiguität von Standardisierungskomitee übersehen worden. Zumindest finde ich nichts zur Auflösung im FCD.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937093</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 06 Aug 2010 12:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to [C++0x] Stringliterale &amp;amp; Templates on Fri, 06 Aug 2010 13:07:27 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Allerdings frage ich mich gerade, was passiert, wenn ein benutzerdefinierter Suffix mit einem Zeichen anfängt, welches noch zu einem Integer- oder Float-Literal gehören könnte. ZB 0x333BenutzerSuffix. Das könnte man jetzt auf zwei Arten zerlegen:</p>
<pre><code>0x333 BenutzerSuffix
0x333B enutzerSuffix
</code></pre>
<p>Vielleicht ist diese Ambiguität von Standardisierungskomitee übersehen worden. Zumindest finde ich nichts zur Auflösung im FCD.</p>
</blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2747.html" rel="nofollow">N2747</a> sagt dazu:</p>
<blockquote>
<p>[...] Any user-defined suffix starting with [A-Fa-f] has a potential conflict with hexidecimal notation. While the proposal defines away ambiguity (N2378 section 5 &quot;Proposed Wording&quot;, modifying clause 13.5.8 over.literal, paragraph 0), that definition effectively means that suffixes intended for use with arbitrary integers must avoid more than 22% of the available suffix namespace. Some of these effectively prohibited suffixes would otherwise be the natural choice. The same applies to floating point values, e.g. &quot;e&quot; as electron charges, though to a lesser degree. [...]</p>
</blockquote>
<p>Wie gesagt, ich sehe davon nichts im <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf" rel="nofollow">FCD</a>. Vielleicht bin ich aber auch blind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937106</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 06 Aug 2010 13:07:27 GMT</pubDate></item></channel></rss>