<?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[Type aus trait benutzen]]></title><description><![CDATA[<p>Servus,</p>
<p>mich plagt gerade folgendes Problem:</p>
<p>Es gibt ID-Objekte von folgendem Typ:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct Id {
    typedef T Type;
    int id_;
    bool flag_;
    Id(int id, bool flag):id_(id), flag_(flag) {};
};
</code></pre>
<p>, die sind in einer .h Datei angelegt:</p>
<pre><code class="language-cpp">static const Id&lt;float&gt; SOME_ID(23,true);
static const Id&lt;int&gt; SOME_OTHER_ID(42,true);
</code></pre>
<p>Der Benutzer soll sich nicht drum kümmern müssen, dass SOME_ID für floats ist und SOME_OTHER_ID für ints.</p>
<p>Daher ist der typedef vorgesehen, damit man hinterher rauskriegt, was für ein Typ drinsteckt. Das geht aber nicht:</p>
<pre><code class="language-cpp">void foo() 
{
    SOME_ID::Type t;
    t = 17;
}
</code></pre>
<p>Geht nicht, weil</p>
<pre><code>14: error: ‘SOME_ID’ is not a class or namespace
37: error: expected ‘(’ before ‘t’
37: error: expected ‘;’ before ‘t’
</code></pre>
<p>Mein Ziel ist es, das</p>
<pre><code class="language-cpp">SOME_ID::Type t = 17.23;
</code></pre>
<p>kompiliert wird, aber</p>
<pre><code class="language-cpp">SOME_ID::Type t = &quot;foo&quot;;
</code></pre>
<p>nicht, weil ein String nicht in float konvertiert werden kann.</p>
<p>Wie erreiche ich das?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277071/type-aus-trait-benutzen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 02:23:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277071.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Nov 2010 15:28:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Type aus trait benutzen on Fri, 12 Nov 2010 15:28:13 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>mich plagt gerade folgendes Problem:</p>
<p>Es gibt ID-Objekte von folgendem Typ:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct Id {
    typedef T Type;
    int id_;
    bool flag_;
    Id(int id, bool flag):id_(id), flag_(flag) {};
};
</code></pre>
<p>, die sind in einer .h Datei angelegt:</p>
<pre><code class="language-cpp">static const Id&lt;float&gt; SOME_ID(23,true);
static const Id&lt;int&gt; SOME_OTHER_ID(42,true);
</code></pre>
<p>Der Benutzer soll sich nicht drum kümmern müssen, dass SOME_ID für floats ist und SOME_OTHER_ID für ints.</p>
<p>Daher ist der typedef vorgesehen, damit man hinterher rauskriegt, was für ein Typ drinsteckt. Das geht aber nicht:</p>
<pre><code class="language-cpp">void foo() 
{
    SOME_ID::Type t;
    t = 17;
}
</code></pre>
<p>Geht nicht, weil</p>
<pre><code>14: error: ‘SOME_ID’ is not a class or namespace
37: error: expected ‘(’ before ‘t’
37: error: expected ‘;’ before ‘t’
</code></pre>
<p>Mein Ziel ist es, das</p>
<pre><code class="language-cpp">SOME_ID::Type t = 17.23;
</code></pre>
<p>kompiliert wird, aber</p>
<pre><code class="language-cpp">SOME_ID::Type t = &quot;foo&quot;;
</code></pre>
<p>nicht, weil ein String nicht in float konvertiert werden kann.</p>
<p>Wie erreiche ich das?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979538</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 15:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Fri, 12 Nov 2010 16:04:54 GMT]]></title><description><![CDATA[<p>Hey,<br />
das Problem ist, das du den Scopeoperator :: hier auf eine Instanz anwendest und nicht auf eine Klasse.<br />
Möglich wäre also nur folgendes:</p>
<pre><code class="language-cpp">typedef Id&lt;float&gt; SOME_ID;
static const SOME_ID SomeId(23,true)
...
SOME_ID::type t = 3.14;
</code></pre>
<p>Also, kurz gesagt, du kannst nicht auf type über eine Instanz der Klasse zugreifen, sondern nur über die Klasse selbst.</p>
<p>Gruß Gate</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979562</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Fri, 12 Nov 2010 16:04:54 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Fri, 12 Nov 2010 17:40:38 GMT]]></title><description><![CDATA[<p>Sowas habe ich befürchtet.<br />
Ich habe jetzt Id-Typen statt Id-Objekte draus gemacht:</p>
<pre><code class="language-cpp">template &lt;typename T, int id, bool flag&gt;
struct Id {
    typedef T Type;
    static int Id() {return id;}
    static bool flag() {return flag;}
};
</code></pre>
<p>Eine ID definiere ich mir dann als</p>
<pre><code class="language-cpp">typedef Id&lt;float, 23, true&gt; SOME_ID;
</code></pre>
<p>und man kann den Typ benutzen:</p>
<pre><code class="language-cpp">SOME_ID::Type t = 1.0;
</code></pre>
<p>Das Problem ist jetzt nur, dass es keine gute Möglichkeit mehr gibt, über alle IDs zu iterieren. Das geht jetzt nur noch Typlisten.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979610</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 17:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Fri, 12 Nov 2010 18:04:47 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Das Problem ist jetzt nur, dass es keine gute Möglichkeit mehr gibt, über alle IDs zu iterieren. Das geht jetzt nur noch Typlisten.</p>
</blockquote>
<p>Vielleicht kannst du auch Type Erasure benutzen. Allerdings müsstest du die Typen bei der Typdefinition irgendwo registrieren.</p>
<p>Aber wie hättest du denn über die Variablen verschiedenen Typs iteriert? Kannst du das ein wenig ausführen (auch falls es sich nur um Iterationen über gleiche Typen handelt)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979624</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 12 Nov 2010 18:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Fri, 12 Nov 2010 21:36:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Vielleicht kannst du auch Type Erasure benutzen. Allerdings müsstest du die Typen bei der Typdefinition irgendwo registrieren.</p>
</blockquote>
<p>Das klingt interessant. Wie geht das?</p>
<blockquote>
<p>Aber wie hättest du denn über die Variablen verschiedenen Typs iteriert? Kannst du das ein wenig ausführen (auch falls es sich nur um Iterationen über gleiche Typen handelt)?</p>
</blockquote>
<p>Völlig korrekt. Die Idee war noch nicht wirklich zuende gedacht. Da muss noch ein bißchen Rotwein drüber getrunken werden <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>Worum es geht:<br />
Bisher gibts ein pdf wo drin steht, wenn du den Datensatz FOO vom Interface haben willst, dann musst du die request-Funktion mit der numerischen ID 4711 und der Flag false aufrufen, und dann bekommst du irgendwann einen float geschickt.</p>
<p>Das ist natürlich völlig Banane, denn Dokumentation wird eh nie gelesen und außerdem sollte ein falscher Aufruf schon so früh wie möglich krachen.</p>
<p>Daher jetzt der Mechanismus: Ich bin an FOO_ID interessiert, dann leg ich mir mal einen FOO::Type an und rufe die request-Funktion mit FOO_ID::id() und FOO_ID::flag() auf. Damit kommt keiner mehr durcheinander und wenn jemand einen inkompatiblen Typ angibt, klopft ihm der Kompiler auf die Finger.<br />
So weit, so gut.</p>
<p>Jetzt geistert in meinem Kopf die Idee rum, durch die &quot;Liste&quot; aller verfügbaren IDs (die ja jetzt Typen sind) zu iterieren, um sagen wir mal dynamisch in Qt einen Dialog aufzubauen, der jeden Wert in ein Edit-Feld schreibt oder so.</p>
<p>Ich hoffe, an dem Beispiel wird klar, wo die Reise hingehen soll.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979705</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Sat, 13 Nov 2010 10:30:58 GMT]]></title><description><![CDATA[<p>Du kannst zur Laufzeit nicht über verschiedene Typen iterieren, darum musst du sie vereinheitlichen. Type Erasure nennt man die Technik, von statischen Typinformationen zu abstrahieren, aber Typsicherheit zur Laufzeit zu erhalten.</p>
<p>Dabei geht es darum, ein gemeinsames Interface für die Typen zu erstellen. Du musst dir einen Weg überlegen, wie du Typen überhaupt ansprechen willst (wie soll der Benutzer erfahren, welche Typen es gibt? Über Strings? <code>std::type_info</code> ? Sonstige IDs?)</p>
<pre><code class="language-cpp">// Abstrakte Basisklasse für gemeinsames Ansprechen
class BaseType
{
    public:
        virtual ~BaseType();
        // Deine abstrakte Schnittstelle
    private:
        // ...
};

// Klasse, die statische Typinformation hat und diese in
// ihren virtuellen Funktionen benutzt
template &lt;typename ConcreteType&gt;
class DerivedType : public BaseType
{
    // ...
};
</code></pre>
<p>Registrieren kannst du die Typen z.B. in einem <code>boost::ptr_vector&lt;BaseType&gt;</code> . Übrigens implementiert <code>boost::any</code> mehr oder weniger genau sowas wie <code>BaseType</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979800</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 13 Nov 2010 10:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to Type aus trait benutzen on Sat, 13 Nov 2010 12:20:28 GMT]]></title><description><![CDATA[<p>Ach das meinst du. Benutze ich die ganze Zeit, wusste nur nicht, dass es so heißt <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>Das geht natürlich, solange die IDs eben Objekte und nicht Typen sind.</p>
<p>Im jetzt gewählten Modell müsste man die Typen in einer Typliste registrieren. Was böte sich dafür an?</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979843</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 13 Nov 2010 12:20:28 GMT</pubDate></item></channel></rss>