<?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[Gesucht: Mapping Konstante -(compiletime)-&amp;gt; string -(runtime)-&amp;gt; Konstante &amp;amp;&amp;amp; Konstante -(compiletime)-&amp;gt;]]></title><description><![CDATA[<p>Folgendes Szenario:</p>
<p>Ich habe eine Handvoll Eventklassen, die jeweils aus 1) einem Tag (&quot;Category&quot;) und b) einem Datenfeld bestehen, wobei das Datenfeld von Event zu Event unteschiedliche Typen hat, abhängig vom Tag. Beispiel:</p>
<pre><code>Klasse ServerEvent, mapping:
Tag SEVT1 -&gt; void
Tag SEVT2 -&gt; string
Tag SEVT3 -&gt; int

Klasse ClientEvent, mapping:
Tag CEVT1 -&gt; bool
Tag CEVT2 -&gt; FooBar
...
</code></pre>
<p>Hab ich soweit ganz gut umsetzen können, wobei das Tag jeweils ein eigenes Enum ist, das Mapping wird über ein passendes Template (Traits) gepflegt. Der Nachteil: ich muss die Deklarationen der verschiedenen Tags (enum-Werte) zuerst schreiben und getrennt davon das Mapping, muss also jeden enum-Wert zweimal angeben:</p>
<pre><code class="language-cpp">struct ClientEventCategory_t
  {
    enum ValueType 
    { 
      PING,
      CUSTOM,
      /* ... */
    };

    struct ErrorUnmappedDataType;

    template &lt;ValueType enumerator&gt;
    struct Traits
    { 
      typedef ErrorUnmappedDataType type; 
    };

  };

#define CATEGORY_MAP(cat, thetype)           \
    template&lt;&gt;                               \
    struct ClientEventCategory_t::Traits&lt;ClientEventCategory_t::cat&gt;    \
    {                                        \
      typedef thetype type;                  \
    }

    CATEGORY_MAP(PING, void);
    CATEGORY_MAP(CUSTOM, std::string);
    /* ... */
#undef CATEGORY_MAP
</code></pre>
<p>Die eigentliche Definition der Event-Klasse erfolgt dann simpel über Instanziierung eines fertigen EventBase-Templates mit dem struct.</p>
<p>Was mir jetzt noch fehlt: Serialisierung/Deserialisierung der Events, ich möchte sie als xmls abspeichern/verschicken können. Dazu bräuchte ich ein weiteres Mapping Tag&lt;-&gt;String, wobei die eine Richtung Tag-&gt;String zur Compilezeit möglich sein sollte, die andere zur Laufzeit. Ich hatte an eine map gedacht, die durch dynamische Initialisierung von irgendwelchen statischen Konstanten belegt wird. Das bedeutet aber, dass ich jeden Tag ein bis zwei weitere Male erwähnen muss - zur Belegung der Map und für das Compiletime-Mapping. Der Wartbarkeit wegen hätte ich am Liebsten aber, dass eine einmalige Erwähnung des Tags schon genügen würde, mit einem entsprechend komplexeren Makro. Mir ist dabei klar, dass die Tags dann keine enum-Werte mehr sein können sondern irgendwelche statischen Konstanten sein müssten.</p>
<p>Erschwerend kommt zum Ganzen hinzu, dass ich unter MSVC2010 entwickle und deshalb constexpr etc. nicht verfügbar sind.<br />
Ich hoffe die Idee kommt in etwa rüber - hat jemand Vorsachläge? Der Wunschcode sieht in etwa so aus:</p>
<pre><code class="language-cpp">DEFINE_EVENT_CLASS(ClientEvent)
{
  ADD_TAG(PING, void);
  ADD_TAG(CUSTOM, std::string);
  /* ... */
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/297711/gesucht-mapping-konstante-compiletime-gt-string-runtime-gt-konstante-amp-amp-konstante-compiletime-gt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 07:34:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297711.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jan 2012 10:58:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gesucht: Mapping Konstante -(compiletime)-&amp;gt; string -(runtime)-&amp;gt; Konstante &amp;amp;&amp;amp; Konstante -(compiletime)-&amp;gt; on Thu, 05 Jan 2012 10:58:50 GMT]]></title><description><![CDATA[<p>Folgendes Szenario:</p>
<p>Ich habe eine Handvoll Eventklassen, die jeweils aus 1) einem Tag (&quot;Category&quot;) und b) einem Datenfeld bestehen, wobei das Datenfeld von Event zu Event unteschiedliche Typen hat, abhängig vom Tag. Beispiel:</p>
<pre><code>Klasse ServerEvent, mapping:
Tag SEVT1 -&gt; void
Tag SEVT2 -&gt; string
Tag SEVT3 -&gt; int

Klasse ClientEvent, mapping:
Tag CEVT1 -&gt; bool
Tag CEVT2 -&gt; FooBar
...
</code></pre>
<p>Hab ich soweit ganz gut umsetzen können, wobei das Tag jeweils ein eigenes Enum ist, das Mapping wird über ein passendes Template (Traits) gepflegt. Der Nachteil: ich muss die Deklarationen der verschiedenen Tags (enum-Werte) zuerst schreiben und getrennt davon das Mapping, muss also jeden enum-Wert zweimal angeben:</p>
<pre><code class="language-cpp">struct ClientEventCategory_t
  {
    enum ValueType 
    { 
      PING,
      CUSTOM,
      /* ... */
    };

    struct ErrorUnmappedDataType;

    template &lt;ValueType enumerator&gt;
    struct Traits
    { 
      typedef ErrorUnmappedDataType type; 
    };

  };

#define CATEGORY_MAP(cat, thetype)           \
    template&lt;&gt;                               \
    struct ClientEventCategory_t::Traits&lt;ClientEventCategory_t::cat&gt;    \
    {                                        \
      typedef thetype type;                  \
    }

    CATEGORY_MAP(PING, void);
    CATEGORY_MAP(CUSTOM, std::string);
    /* ... */
#undef CATEGORY_MAP
</code></pre>
<p>Die eigentliche Definition der Event-Klasse erfolgt dann simpel über Instanziierung eines fertigen EventBase-Templates mit dem struct.</p>
<p>Was mir jetzt noch fehlt: Serialisierung/Deserialisierung der Events, ich möchte sie als xmls abspeichern/verschicken können. Dazu bräuchte ich ein weiteres Mapping Tag&lt;-&gt;String, wobei die eine Richtung Tag-&gt;String zur Compilezeit möglich sein sollte, die andere zur Laufzeit. Ich hatte an eine map gedacht, die durch dynamische Initialisierung von irgendwelchen statischen Konstanten belegt wird. Das bedeutet aber, dass ich jeden Tag ein bis zwei weitere Male erwähnen muss - zur Belegung der Map und für das Compiletime-Mapping. Der Wartbarkeit wegen hätte ich am Liebsten aber, dass eine einmalige Erwähnung des Tags schon genügen würde, mit einem entsprechend komplexeren Makro. Mir ist dabei klar, dass die Tags dann keine enum-Werte mehr sein können sondern irgendwelche statischen Konstanten sein müssten.</p>
<p>Erschwerend kommt zum Ganzen hinzu, dass ich unter MSVC2010 entwickle und deshalb constexpr etc. nicht verfügbar sind.<br />
Ich hoffe die Idee kommt in etwa rüber - hat jemand Vorsachläge? Der Wunschcode sieht in etwa so aus:</p>
<pre><code class="language-cpp">DEFINE_EVENT_CLASS(ClientEvent)
{
  ADD_TAG(PING, void);
  ADD_TAG(CUSTOM, std::string);
  /* ... */
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2163994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163994</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 05 Jan 2012 10:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Gesucht: Mapping Konstante -(compiletime)-&amp;gt; string -(runtime)-&amp;gt; Konstante &amp;amp;&amp;amp; Konstante -(compiletime)-&amp;gt; on Thu, 05 Jan 2012 11:39:09 GMT]]></title><description><![CDATA[<p>Guck Dir mal <code>BOOST_FUSION_DEFINE_STRUCT</code> aus, naja, <code>boost.fusion</code> an. Da sollte der passende Code drin stehen.</p>
<p>PS: Den enum würde ich dabei allerdings direkt aus dem Tags erzeugen und dann über die Eventklasse exponieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164012</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 05 Jan 2012 11:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Gesucht: Mapping Konstante -(compiletime)-&amp;gt; string -(runtime)-&amp;gt; Konstante &amp;amp;&amp;amp; Konstante -(compiletime)-&amp;gt; on Fri, 06 Jan 2012 09:55:41 GMT]]></title><description><![CDATA[<p>Seien wir doch mal ehrlich pumuckl. Mit über 6000 Posts hätte ich jetzt erwartet, dass du wenigstens einmal irgendwo das Wort <strong>Reflections</strong> benutzt.</p>
<p>Zumindest kommt mir so vor als würdest du um dieses Problem herumarbeiten.</p>
<p>Lösungsansätze:<br />
1. Nutzung von entspr. serialisierungs-Frameworks wie boost serialization.</p>
<p>2. Nutzung von einem Code-Generator.<br />
Bei unserer Game-Engine liegen die Event-Typen und entspr. Enums als Primär-Quelle in XML vor. Aus dem XML werden dann verschiedene C++-Klassen/Code generiert, bspw. Enum-Listen.<br />
Läßt sich in Visual Studio wunderbar einbinden, als Pre-Compile-Step.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164402</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Fri, 06 Jan 2012 09:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to Gesucht: Mapping Konstante -(compiletime)-&amp;gt; string -(runtime)-&amp;gt; Konstante &amp;amp;&amp;amp; Konstante -(compiletime)-&amp;gt; on Fri, 06 Jan 2012 10:14:40 GMT]]></title><description><![CDATA[<p>nurf schrieb:</p>
<blockquote>
<p>Seien wir doch mal ehrlich pumuckl. Mit über 6000 Posts hätte ich jetzt erwartet, dass du wenigstens einmal irgendwo das Wort <strong>Reflections</strong> benutzt.</p>
</blockquote>
<p>Hätte ich nicht erwartet. Ganz und gar nicht mit diesem s am Ende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2164410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2164410</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 06 Jan 2012 10:14:40 GMT</pubDate></item></channel></rss>