<?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[Problem mit generischem C++ Code]]></title><description><![CDATA[<p>Hallo C++ Community,</p>
<p>ich habe eine umfangreiche Klasse X mit etwa 50 Optionseinstellungen für eine Anwendung. Der Standardkonstruktor soll diese 50 Objekte beim Erzeugen eines Objektes von X initialisieren. Dafür muss ich alle Einstellungsobjekte in der Initialisierungsliste des ctor von X auflisten.</p>
<p>Nun kann es aber sein, dass weitere benötigte Einstellungen hinzu kommen und der Eintrag im ctor von X vergessen wird, deshalb hätte ich gern nur die Objekte in X als &quot;Codequelle&quot;.</p>
<p>Ich habe mir am WE die Zähne daran ausgebissen, etwas aus Makros zu bauen, dass die Liste im ctor von X automatisch füllt.</p>
<p>Leider ohne Erfolg <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gibt es irgendwelche Design Tricks, mit denen so etwas realisierbar ist ? oder zusätzliche Tools, soetwas wie ein Präprozessor ?</p>
<p>Der Intelli-Sense sollte allerdings damit arbeiten können ...</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272381/problem-mit-generischem-c-code</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 21:14:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272381.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Aug 2010 15:46:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Mon, 16 Aug 2010 15:46:24 GMT]]></title><description><![CDATA[<p>Hallo C++ Community,</p>
<p>ich habe eine umfangreiche Klasse X mit etwa 50 Optionseinstellungen für eine Anwendung. Der Standardkonstruktor soll diese 50 Objekte beim Erzeugen eines Objektes von X initialisieren. Dafür muss ich alle Einstellungsobjekte in der Initialisierungsliste des ctor von X auflisten.</p>
<p>Nun kann es aber sein, dass weitere benötigte Einstellungen hinzu kommen und der Eintrag im ctor von X vergessen wird, deshalb hätte ich gern nur die Objekte in X als &quot;Codequelle&quot;.</p>
<p>Ich habe mir am WE die Zähne daran ausgebissen, etwas aus Makros zu bauen, dass die Liste im ctor von X automatisch füllt.</p>
<p>Leider ohne Erfolg <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gibt es irgendwelche Design Tricks, mit denen so etwas realisierbar ist ? oder zusätzliche Tools, soetwas wie ein Präprozessor ?</p>
<p>Der Intelli-Sense sollte allerdings damit arbeiten können ...</p>
<p>Danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940667</guid><dc:creator><![CDATA[pro_develop]]></dc:creator><pubDate>Mon, 16 Aug 2010 15:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Mon, 16 Aug 2010 15:54:49 GMT]]></title><description><![CDATA[<p>Ja, das könnte man bestimmt irgendwie mit dem Präprozessor zusammenfrickeln, aber hier der supertolle Designtipp:</p>
<p>Fass Einstellungen nach sinnvollen Kategorien zu Klassen zusammen. Zwei Vorteile: Erstens keine krankhaft lange Parameterliste mehr. Zweitens keine Möglichkeit mehr versehentlich Parameter zu vergessen, weil das Typensystem dich davor schützt.</p>
<p>Ach ja, und dein eigentliches Problem behebt es auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940674</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 16 Aug 2010 15:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Mon, 16 Aug 2010 20:17:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Fass Einstellungen nach sinnvollen Kategorien zu Klassen zusammen. Zwei Vorteile: Erstens keine krankhaft lange Parameterliste mehr.</p>
<p>Ach ja, und dein eigentliches Problem behebt es auch.</p>
</blockquote>
<p>Hört sich mir eher nach einem Anti-Pattern an:</p>
<p><a href="http://en.wikipedia.org/wiki/Poltergeist_%28computer_science%29" rel="nofollow">Und zwar den Poltergeist</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940770</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Mon, 16 Aug 2010 20:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Tue, 17 Aug 2010 08:08:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Danke für deinen Vorschlag... ich möchte die Klasse X aber nicht weiter zerteilen, da die Objekte von X auch noch serialisiert werden sollen...</p>
<p>Hat sonst jemand Erfahrungen mit generischem C++ Code ?????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940856</guid><dc:creator><![CDATA[pro_develop]]></dc:creator><pubDate>Tue, 17 Aug 2010 08:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Tue, 17 Aug 2010 08:19:25 GMT]]></title><description><![CDATA[<p>Hast du mal dran gedacht, die Klasse durch ein Script (z.B. in Python) zu generieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940863</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 17 Aug 2010 08:19:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Tue, 17 Aug 2010 11:10:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>: Ja, daran habe ich schon gedacht ... zwei quelltexte sind aber auch nicht einfacher zu handeln ... ich suche etwas wie einen Präprozessor, den man in den Pre-Build einbinden kann ... leider ist der C++ Präprozessor aber nicht &quot;intelligent&quot; genug, um schleifen auszuführen, die lange parameterlisten parsen und verarbeiten ....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940926</guid><dc:creator><![CDATA[pro_develop]]></dc:creator><pubDate>Tue, 17 Aug 2010 11:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 09:26:26 GMT]]></title><description><![CDATA[<p>Hat wirklich keiner sonst noch eine Idee ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941363</guid><dc:creator><![CDATA[pro_develop]]></dc:creator><pubDate>Wed, 18 Aug 2010 09:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 09:32:11 GMT]]></title><description><![CDATA[<p>pro_develop schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Danke für deinen Vorschlag... ich möchte die Klasse X aber nicht weiter zerteilen, da die Objekte von X auch noch serialisiert werden sollen...</p>
</blockquote>
<p>Das ist kein Argument.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941368</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 18 Aug 2010 09:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 09:44:24 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>pro_develop schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Danke für deinen Vorschlag... ich möchte die Klasse X aber nicht weiter zerteilen, da die Objekte von X auch noch serialisiert werden sollen...</p>
</blockquote>
<p>Das ist kein Argument.</p>
</blockquote>
<p>Ich würde sogar sagen, dass ist ein Argument für das Zerteilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941386</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 18 Aug 2010 09:44:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 11:23:42 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Beim Erfassen von Einstellungen unterscheide ich immer zwischen ein paar Werten oder größeren Mengen von Werten. Bei 50 Einstellungen finde ich perönlich ein dynamisches Verfahren mit Schlüssel-Wert Paaren sinnvoller als eine statische Struktur. Eine std::map&lt;std::string, std::string&gt; ist in der Lage wirklich alles zu speichern und hat den Vorteil, dass man den Inhalt etwa als XML importieren und exportieren kann. Eine geeignete Zugriffsfunktion hilft hier sehr:</p>
<pre><code class="language-cpp">typedef std::map&lt;std::string, std::string&gt; StringMap;
StringMap _strmap;

std::string get_setting(std::string const &amp; key)
{
  StringMap::iterator iter = _strmap.find(key);
  if(iter == _strmap.end()) 
    return std::string();
  else
    return iter-&gt;second;
}

std::string get_setting(std::string const &amp; key, std::string const &amp; defaultvalue)
{
  StringMap::iterator iter = _strmap.find(key);
  if(iter == _strmap.end())
    return defaultvalue;
  else
    return iter-&gt;second;
}
</code></pre>
<p>Und nur wenn mich jetzt keiner dafür auslacht ... hier eine andere &quot;generische&quot; Möglichkeit (die aber sicher nicht standard-konform ist, aber unter MSVC funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">template&lt;class T, unsigned OFFSET&gt; struct DefaultValue
{
  static const bool IsDefined = false;
};

#define DEFINE_DEFAULT_VALUE(structname, membertype, membername, membervalue) \
  template&lt;&gt; struct DefaultValue&lt; structname, offsetof(structname, membername) &gt; \
  { \
    static const bool IsDefined = true; \
    typedef membertype Type; \
    static const membertype Value; \
  }; \
  const membertype DefaultValue&lt;structname, offsetof(structname, membername) &gt;::Value(membervalue);

template&lt;class T, unsigned OFFSET, bool DEFINED&gt; struct DoInit;

template&lt;class T, unsigned OFFSET&gt; struct DoInit&lt;T, OFFSET, true&gt;
{
  static void Do(T* ptrStruct)
  {
    typedef typename DefaultValue&lt;T, OFFSET&gt;::Type MemberType;
    MemberType * ptrMember = reinterpret_cast&lt;MemberType*&gt;(reinterpret_cast&lt;char *&gt;(ptrStruct) + OFFSET);
    *ptrMember = DefaultValue&lt;T, OFFSET&gt;::Value;
  }
};

template&lt;class T, unsigned OFFSET&gt; struct DoInit&lt;T, OFFSET, false&gt;
{
  static void Do(T* ptrStruct) { }
};

template&lt;class T, unsigned OFFSET&gt; struct TryInit
{
  static void Do(T* ptrStruct)
  {
    DoInit&lt;T, OFFSET, DefaultValue&lt;T, OFFSET&gt;::IsDefined&gt;:: Do(ptrStruct);
    TryInit&lt;T, OFFSET - 1&gt;:: Do(ptrStruct);
  }
};

template&lt;class T&gt; struct TryInit&lt;T, 0&gt;
{
  static void Do(T* ptrStruct)
  {
    DoInit&lt;T, 0, DefaultValue&lt;T, 0&gt;::IsDefined&gt;:: Do(ptrStruct);
  }
};

template&lt;class T&gt;
struct Init : public T
{
  Init()
  {
    TryInit&lt;T, sizeof(T)&gt;:: Do(this);
  }
};
</code></pre>
<p>Und so funktioniert's:<br />
Die Initialisierungs-Werte sind in der template-Spezialisierung DefaultValue mit dem member-offset als Parameter gespeichert (Es hat mich echt gewundert, dass offsetof statisch ausgewertet werden kann :p ) Das Init-Template läuft nun alle offsets von sizeof(T) bis 0 durch und versucht an dieser Stelle einen Wert zu schreiben, falls einer definiert wurde:</p>
<pre><code class="language-cpp">struct X
{
  int  a;
  int  b;
  std::string s;
};

DEFINE_DEFAULT_VALUE(X, int, a, 24);
DEFINE_DEFAULT_VALUE(X, int, b, 42);
DEFINE_DEFAULT_VALUE(X, std::string, s, &quot;Hello World&quot;);

int main()
{
  Init&lt;X&gt; x;
}
</code></pre>
<p>Der Code soll hier aber nur als Beispiel dienen, dass es möglich ist Member über Meta-Klassen zu finden. Ich würde das aber in der Praxis nicht so machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /><br />
Dieses Beispiel war ein Experiment für struct-Serialisierung, wobei ich es aber dann sinnvoller empfand, die Member zu numerieren und der Metaklasse eine Accessor-Methode für den Member zu geben ... dafür muss aber die Numerierung stabil bleiben, was beim ständigen erweitern von Strukturen aufwendig wird ... vor allem bei über 50 Member <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ... alles in allem: Metacode ist cool <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="😉"
    /> aber komplex</p>
<p>lg XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941467</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Wed, 18 Aug 2010 11:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 12:47:00 GMT]]></title><description><![CDATA[<p>Hallo xor,</p>
<p>danke für deine Antwort.</p>
<p>Dein erster Vorschlag, war auch mein Ansatz. Aber damit habe ich ja den Intelli-Sense unter MSVC nicht zur Verfügung, selbst wenn ich Operatoren überlade, um die einzelnen Elemente zu selektieren.</p>
<p>z.B.</p>
<pre><code class="language-cpp">Einstellungen.Port = 12;
Einstellungen.Baudrate = 9600;
Einstellungen.InterfaceName = &quot;Serial Interface to AVR Board&quot;
</code></pre>
<p>Bei dem zweiten Beispiel hat sich mir die Frage aufgedrängt, wie man so ein komplexes Gebilde noch administrieren kann ????<br />
Da muss ich mich ja erst wieder ne Stunde einlesen, falls ich die Struktur ändern möchte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ein Kollege hat mir hier heute noch einen Tipp gegeben... das geht aber in den Aufbau des Maschinencodes hinein ... dabei müsste ich den Aufbau der Klasse aus dem Code lesen und dann die Adressen der Member Variablen zum Zugriff verwenden ... klingt auch ziemlich heftig ...</p>
<p>Hat jemand mit dem Thema (Reflections) Erfahrungen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1941532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941532</guid><dc:creator><![CDATA[pro_develop]]></dc:creator><pubDate>Wed, 18 Aug 2010 12:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit generischem C++ Code on Wed, 18 Aug 2010 13:46:53 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Gegen das vergessen der Initialisierung.</p>
<p>Hier hilft eine kleine Klasse die einen Parameter besitzt und über einen Konstruktor 'zwangsweise' initialisiert werden muss.<br />
der operator () hilft dann das man transparent auf die Typen zugreifen kann wie eigentlich vorgesehen.<br />
Vielleicht ist es das was Du suchst.</p>
<p>Versuch mal im Beispiel in der Classe cOptions noch so ein Konstrukt anzulegen 'OHNE' in zu Initialisieren. Da hat der Compiler aber schwer was dagegen. <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>Lichtlein</p>
<pre><code class="language-cpp">template&lt; typename t &gt;
class cParaMustInit
{
public:
    cParaMustInit( const t T ) : mT(T) {}
    t operator () () { return mT; }
private:
    cParaMustInit();
    cParaMustInit(const cParaMustInit &amp;);

    t mT;
};

class cOptions
{
public:
    cOptions(int Baudrate, char* Name) : mBaudrate(Baudrate), mName(Name) {}

    cParaMustInit&lt;int&gt;      mBaudrate;
    cParaMustInit&lt;char*&gt;    mName;
};

int main(int argc, char *argv[])
{
    cOptions Options(10, &quot;huhu&quot;);

    Options.mBaudrate = 10;
    Options.mName = &quot;Jetzt mal ein Name&quot;;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1941576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1941576</guid><dc:creator><![CDATA[Lichtlein]]></dc:creator><pubDate>Wed, 18 Aug 2010 13:46:53 GMT</pubDate></item></channel></rss>