<?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[Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern]]></title><description><![CDATA[<p>Hallo <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>Der Titel sagt's fast schon, hier die Idee als Code:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Object {
public:
    Object(const std::string&amp; name, T * pVar) : m_pData(pVar),
    m_name(name) {

    }

    void value(T val) {
        *m_pData = value;
    }

    void name(const std::string&amp; name) {
        m_name = name;
    }

private:
    T* m_pData;
    std::string m_name;
};

// Legt Objekte an
class FriendlyHelper {
public:

    template &lt;class T&gt;
    void remind(const std::string&amp; name, T * pVar) {
        Object&lt;T&gt; obj(name, pVar);
        // Wie kann 'Obj' jetzt in einem Container gespeichert werden?
        // Identifikationsmerkmal waere der Name.
    }

    template &lt;class T&gt;
    void setVal(const std::string&amp; name, T val) {
        // Zugriff z.B. durch lookup in einer Map:
        // map[name].value(val);
    }
};

int main() {

    int a = 17, b = 20;

    FriendlyHelper fh;
    fh.remind(&quot;Integer A&quot;, &amp;a);
    fh.remind(&quot;Integer B&quot;, &amp;b);

    // [...]

    // Irgendwann spaeter
    fh.setVal(&quot;Integer A&quot;, 300);

    //...
}
</code></pre>
<p>Ich bin also zwingend darauf angewiesen, den Typen zu kennen, damit ich den Wert später setzen kann.</p>
<p>Ich komme da gerade auf keine schöne Lösung. Ist meine Idee überhaupt so realisierbar? Falls nein, was wäre ein Ansatz für eine Alternative? Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/309936/unterschiedliche-template-ausprägungen-eines-objekts-in-einem-container-speichern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 02:34:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309936.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Oct 2012 21:52:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern on Tue, 30 Oct 2012 21:52:15 GMT]]></title><description><![CDATA[<p>Hallo <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>Der Titel sagt's fast schon, hier die Idee als Code:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Object {
public:
    Object(const std::string&amp; name, T * pVar) : m_pData(pVar),
    m_name(name) {

    }

    void value(T val) {
        *m_pData = value;
    }

    void name(const std::string&amp; name) {
        m_name = name;
    }

private:
    T* m_pData;
    std::string m_name;
};

// Legt Objekte an
class FriendlyHelper {
public:

    template &lt;class T&gt;
    void remind(const std::string&amp; name, T * pVar) {
        Object&lt;T&gt; obj(name, pVar);
        // Wie kann 'Obj' jetzt in einem Container gespeichert werden?
        // Identifikationsmerkmal waere der Name.
    }

    template &lt;class T&gt;
    void setVal(const std::string&amp; name, T val) {
        // Zugriff z.B. durch lookup in einer Map:
        // map[name].value(val);
    }
};

int main() {

    int a = 17, b = 20;

    FriendlyHelper fh;
    fh.remind(&quot;Integer A&quot;, &amp;a);
    fh.remind(&quot;Integer B&quot;, &amp;b);

    // [...]

    // Irgendwann spaeter
    fh.setVal(&quot;Integer A&quot;, 300);

    //...
}
</code></pre>
<p>Ich bin also zwingend darauf angewiesen, den Typen zu kennen, damit ich den Wert später setzen kann.</p>
<p>Ich komme da gerade auf keine schöne Lösung. Ist meine Idee überhaupt so realisierbar? Falls nein, was wäre ein Ansatz für eine Alternative? Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2265775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265775</guid><dc:creator><![CDATA[Handcreme]]></dc:creator><pubDate>Tue, 30 Oct 2012 21:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern on Tue, 30 Oct 2012 22:07:12 GMT]]></title><description><![CDATA[<p>Speichern kannst du zwar, wenn du Object einer nichttemplateden Basisklasse erben lässt, aber setzen und auslesen geht schlecht typsicher. Zumindest nur mit dynamic_cast und auf den sollte man verzichten weil er langsam ist.</p>
<p>Also sag lieber, wozu du das brauchst. Warum kann FriendlyHelper kein Template sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265776</guid><dc:creator><![CDATA[aethbAM]]></dc:creator><pubDate>Tue, 30 Oct 2012 22:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern on Tue, 30 Oct 2012 22:18:38 GMT]]></title><description><![CDATA[<p>aethbAM schrieb:</p>
<blockquote>
<p>Zumindest nur mit dynamic_cast und auf den sollte man verzichten weil er langsam ist.</p>
</blockquote>
<p>Vor allem deutet es auf einen schweren Designfehler hin, weil man in einer Situation ist, wo man man den dynamischen Typ eines Objekts kennen muss, diesen aber nicht kennt. Ein wahrscheinlicher Grund dafür ist, dass man zusammengeworfen hat, was nicht zusammen gehört.</p>
<blockquote>
<p>Also sag lieber, wozu du das brauchst.?</p>
</blockquote>
<p>+1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265779</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 30 Oct 2012 22:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern on Tue, 30 Oct 2012 22:50:29 GMT]]></title><description><![CDATA[<p>Okay, dann hier der Hintergrund:</p>
<p>Ich möchte eine Klasse zur Verfügung stellen (der <strong>FriendlyHelper</strong>), die es ermöglicht, andere Klassen zur Laufzeit zu untersuchen und zu manipulieren. <strong>Beispiel</strong>: Der Nutzer hat folgende Klasse geschrieben:</p>
<pre><code class="language-cpp">class IrgendeineKlasse {
public:
	IrgendeineKlasse() : a(17), b(20), c(1.333) {

	}

private:
	  int a,b;
	  float c;
};
</code></pre>
<p>Jetzt möchte der Nutzer Ausprägungen dieser Klasse gerne zur Laufzeit überwachen und ggfs. auch Variablen verändern. Hier meine Idee dazu:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Object {
public:
    Object(const std::string&amp; name, T * pVar) : m_pData(pVar),
    m_name(name) {

    }

    void value(T val) {
        *m_pData = value;
    }

    void name(const std::string&amp; name) {
        m_name = name;
    }

private:
    T* m_pData;
    std::string m_name;
};

class FriendlyHelper {
public:
	FriendlyHelper(const std::string&amp; className) : m_className(className) {
		globalController-&gt;registerHelperClass(this);
	}

    template &lt;class T&gt;
    void remind(const std::string&amp; name, T * pVar) {
        Object&lt;T&gt; obj(name, pVar);
        // Wie kann 'Obj' jetzt in einem Container gespeichert werden?
        // Identifikationsmerkmal waere der Name.
    }

    template &lt;class T&gt;
    void setVal(const std::string&amp; name, T val) {
        // Zugriff z.B. durch lookup in einer Map:
        // map[name].value(val);
    }

private:
	std::string m_className;
};
</code></pre>
<p>Wer jetzt schnell gescrollt hat: Es gibt zwei Änderungen. FriendlyHelper wird ein String im ctor übergeben und im ctor meldet sich der FriendlyHelper bei einem globalen Controller <strong>globalController</strong> an.<br />
Jetzt ist folgendes möglich:</p>
<pre><code class="language-cpp">class IrgendeineKlasse : public FriendlyHelper {
public:
	IrgendeineKlasse() : FriendlyHelper(&quot;IrgendeineKlasse&quot;), a(17), b(20), c(1.333) {
		remind(&quot;Integer A&quot;, &amp;a);
		remind(&quot;Integer B&quot;, &amp;b);
		remind(&quot;Float C&quot;, &amp;c);
	}

private:
	  int a,b;
	  float c;
};
</code></pre>
<p>Der Nutzer erbt also einfach vom FriendlyHelper und meldet dort an, was er gerne überwacht hätte bzw. welche Variablen er preisgeben möchte.</p>
<p>Und so kann man dann darauf zugreifen:</p>
<pre><code class="language-cpp">globalController.setValue(&quot;IrgendeineKlasse.Integer B&quot;, 300);
	int val = globalController.getValue(&quot;IrgendeineKlasse.Integer B&quot;);
</code></pre>
<p>Anhand des Pfades kann geprüft werden, ob solch eine Variable überhaupt existiert. Wir ignorieren jetzt mal den Fall, das mehrere Objekte eines Typs angelegt werden können. In diesem Fall würde dann eben eine ID vergeben.</p>
<p>------<br />
Das war mein genereller Ansatz und dafür brauche ich die beschriebene Funktionalität. Das Design ist also Mist? Ok, ich bin lernwillig und aufgeschlossen, wie kann ich das lösen? <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="😕"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2265787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265787</guid><dc:creator><![CDATA[Handcreme]]></dc:creator><pubDate>Tue, 30 Oct 2012 22:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Template-Ausprägungen eines Objekts in einem Container speichern on Tue, 30 Oct 2012 23:03:32 GMT]]></title><description><![CDATA[<p>Aus einem anderem Thema hier im Forum:</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Die Notwendigkeit, den genauen Typ eines Objektes zur Laufzeit herausfinden zu müssen, widerspricht dem objektorientierten Gedanken der Kapselung völlig - der Client-Code soll die Implementationsdetails der Objekte, mit denen er arbeitet, nicht kennen müssen, sondern lediglich ihre Schnittstelle.</p>
</blockquote>
<p>Ja, genau das will ich, die Kapselung durch den Controller aufheben bzw. Implementationsdetails bekanntmachen. Wobei in meinem Fall ja jede Klasse immer noch selbst bestimmen kann, was welche Variablen sie bekanntmachen will.</p>
<p>Wie gesagt, für andere Lösungen bin ich sehr offen, aber es geht schon darum, an die interna heranzukommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265792</guid><dc:creator><![CDATA[Handcreme]]></dc:creator><pubDate>Tue, 30 Oct 2012 23:03:32 GMT</pubDate></item></channel></rss>