<?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[operator [] als Template]]></title><description><![CDATA[<p>Einfache Frage, gegeben sei ein überladener operator [], der ein Template ist, wobei der Parameter T nicht deduzierbar ist. Gibt es eine schönere Aufrufsyntax als die folgende?</p>
<pre><code class="language-cpp">foo.operator[]&lt;int&gt;(bar);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/301446/operator-als-template</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 03:37:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301446.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Mar 2012 14:58:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 14:58:04 GMT]]></title><description><![CDATA[<p>Einfache Frage, gegeben sei ein überladener operator [], der ein Template ist, wobei der Parameter T nicht deduzierbar ist. Gibt es eine schönere Aufrufsyntax als die folgende?</p>
<pre><code class="language-cpp">foo.operator[]&lt;int&gt;(bar);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2195883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195883</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 27 Mar 2012 14:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 15:06:26 GMT]]></title><description><![CDATA[<p>Nenn die Funktion get, at, oder ähnlich <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>Oder bau irgendwie künstlich ein deduzierbares Argument ein. Z.B: Bestimmt der Parameter den Rückgabetyp? Dann gib per Referenz zurück.</p>
<p>Also kurz gesagt: Nein, es gibt keine schönere Syntax, du musst schon noch irgendetwas ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195885</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 27 Mar 2012 15:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 15:10:09 GMT]]></title><description><![CDATA[<p>Hintergrund: Ich habe einen kleinen Parser für Konfigurationsdateien. Der Parser kann gewöhnliche C++-Literale (char const*, int, double, etc) parsen, wobei er intern die Daten auch gleich (mittels Type Erasure) im richtigen Format abspeichert. Ich dachte mir nun, einen operator [] wie folgt zu bauen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T const&amp; operator [] (std::string const&amp; what);
</code></pre>
<p>Aber das geht ja nun wohl nicht. get und at gefällt mir aber irgendwie auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195888</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 27 Mar 2012 15:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 15:16:49 GMT]]></title><description><![CDATA[<p>Wie soll das überhaupt funktionieren, wenn what bestimmt welchen Typ du zurückgibst? Ich kann dir da nicht ganz folgen glaube ich.</p>
<p>Edit: Ach so, du willst einfach nachgucken ob der Wert nach T konvertierbar ist. Na ja, da würde ich es auch einfach get nennen. foo.get&lt;int&gt;(&quot;blubb&quot;); sieht doch nicht so schlimm aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195889</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Mar 2012 15:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 15:15:48 GMT]]></title><description><![CDATA[<p>&quot;what&quot; bestimmt den Typ nicht. Wenn ich schreibe:</p>
<pre><code class="language-cpp">cnf.get&lt;int&gt;(&quot;foo&quot;);
</code></pre>
<p>wird intern ein dynamic_cast ausgeführt, der überprüft, ob &quot;foo&quot; tatsächlich vom Typ int ist. Wenn nicht -&gt; Exception.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195891</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 27 Mar 2012 15:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 15:18:13 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">cnf.get&lt;int&gt;(&quot;foo&quot;);
</code></pre>
</blockquote>
<p>Gerade editiert. Wie gesagt, ich finde das nicht schlimm so. Der Typ ist anders ja nicht auffindbar und quasi ein zusätzlicher Parameter, insofern erhöht das ja die Redundanz nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195892</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Mar 2012 15:18:13 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:03:44 GMT]]></title><description><![CDATA[<p>Wenn die Daten ursprünglich schon als string vorliegen, warum speicherst du sie dann nicht als string ab und konvertierst sie erst beim Aufruf von <code>get&lt;T&gt;</code> nach T?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195911</guid><dc:creator><![CDATA[lazycoder]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:03:44 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:09:27 GMT]]></title><description><![CDATA[<p>Weil die Daten bereits beim Einlesen validiert werden sollen, da geschieht das Konvertieren in einem Aufwaschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195913</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:12:45 GMT]]></title><description><![CDATA[<p>lazycoder schrieb:</p>
<blockquote>
<p>Wenn die Daten ursprünglich schon als string vorliegen, warum speicherst du sie dann nicht als string ab und konvertierst sie erst beim Aufruf von <code>get&lt;T&gt;</code> nach T?</p>
</blockquote>
<p>Das ist ein andere Art der Datenspeicherung. Wenn man so etwas hat wie xml, ist das natürlich der einzige Weg. Man kann ja beim einlesen auch nicht wissen (sondern nur raten), welchen Typ etwas hat.</p>
<p>Wenn die Datenstruktur den Typ allerdings speichert, ist das etwas anderes. Dann möchte man vielleicht auch garantiert sofort entdecken ob ein Wert zum Typ passt.<br />
Wenn das nicht der Fall ist, wie oben gesagt, macht man die Umwandlung natürlich erst bei der Abfrage.</p>
<p>Edit: Argh, dauernd zu spät in letzter Zeit. -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195915</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:24:36 GMT]]></title><description><![CDATA[<p>Selbst wenn es binär ist, kann man es immer noch im Rohformat speichern und erst beim Auslesen validieren. Noch besser: Wenn nicht alles auf einmal benötigt wird, kann man sequenziell aus der Datei lesen.</p>
<p>Wenn alles auf einmal passiert hat das nur Nachteile, z.B. muss die ganze Datei zweimal im Speicher behalten werden (Validiert und Nutzung) und es ist langsamer, weil beim langsamen Lesen alles blockiert ist und ein Verwaltungsoverhead (dynamic_cast) da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195925</guid><dc:creator><![CDATA[lazycoder]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:27:03 GMT]]></title><description><![CDATA[<p>Mit binär/nicht binär hat das weniger zu tun, aber na ja.<br />
Wie gesagt: Du kannst ja gerne gegen die Validierung argumentieren, aber das ändert nichts daran, dass das die einzige Lösung ist <strong>wenn</strong> man die Daten prüfen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195927</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 16:44:51 GMT]]></title><description><![CDATA[<p>Habe ich dich richtig verstanden, dass du im Parser die Typen kennst und als Templateparameter setzen könntest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195933</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 27 Mar 2012 16:44:51 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 17:37:09 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Habe ich dich richtig verstanden, dass du im Parser die Typen kennst</p>
</blockquote>
<p>Ja.</p>
<p>Michael E. schrieb:</p>
<blockquote>
<p>und als Templateparameter setzen könntest?</p>
</blockquote>
<p>Wie meinst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195952</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 27 Mar 2012 17:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator [] als Template on Tue, 27 Mar 2012 18:04:28 GMT]]></title><description><![CDATA[<p>Machs anders rum: gieb einen Proxy zurueck der einen operator T hat.</p>
<p>Folgendes:</p>
<pre><code class="language-cpp">//dein op[]
Proxy operator[](string const&amp; what) {
   return Proxy(this, what);
}

//proxy sieht dann etwa so aus:
class Proxy {
private:
  DB* db; // zeiger auf die parser db wo die werte liegen
  string what;
  Proxy(DB* db, string const&amp; what) : db(db), what(what) {}
public:
   //hier die magie
  template&lt;typename T&gt;
  operator T() {
     return db-&gt;get&lt;T&gt;(what);
  }
};
</code></pre>
<p>Man muss natuerlich ueberpruefen was Proxy jetzt alles genau koennen muss - aber prinzipiell ist die Idee die Ausfuehrung des Codes vom op[] in den opT zu verlagern, da wir dort auf den return Typen aufloesen koennen.</p>
<p>Dann laesst sich ein:</p>
<pre><code class="language-cpp">int i=conf[&quot;foo&quot;];
double f=conf[&quot;bar&quot;];
</code></pre>
<p>machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2195958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2195958</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 27 Mar 2012 18:04:28 GMT</pubDate></item></channel></rss>