<?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[Frage an STL GURUS!!!!!]]></title><description><![CDATA[<p>Hallo Zusammen!!!</p>
<p>Habe folgendes Problem: Ich versuche in eine STL Liste (list&lt;T&gt;, z.B. T -&gt; int) Elemente einzufügen, habe aber nur einen void Pointer auf die Liste und einen Funktionspointer auf die entsprechende push_back Methode. Allgemein formuliert, ist es überhaupt möglich (gerne auch mit Hacks in einen STL Container Elemente einzufügen ohne explizites Wissen über den Template Parameter?</p>
<p>Das ganze soll einem serialisierungs/deserialisierungs Mechanismus dienen (logischerweise für STL Container dienen).</p>
<p>vielen dank und gruß<br />
Tobber</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233364/frage-an-stl-gurus</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 23:21:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233364.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Feb 2009 19:14:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 19:14:34 GMT]]></title><description><![CDATA[<p>Hallo Zusammen!!!</p>
<p>Habe folgendes Problem: Ich versuche in eine STL Liste (list&lt;T&gt;, z.B. T -&gt; int) Elemente einzufügen, habe aber nur einen void Pointer auf die Liste und einen Funktionspointer auf die entsprechende push_back Methode. Allgemein formuliert, ist es überhaupt möglich (gerne auch mit Hacks in einen STL Container Elemente einzufügen ohne explizites Wissen über den Template Parameter?</p>
<p>Das ganze soll einem serialisierungs/deserialisierungs Mechanismus dienen (logischerweise für STL Container dienen).</p>
<p>vielen dank und gruß<br />
Tobber</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657498</guid><dc:creator><![CDATA[Tobias Harley]]></dc:creator><pubDate>Tue, 03 Feb 2009 19:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 19:18:35 GMT]]></title><description><![CDATA[<p>du suchst sowas?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
void containerpush(std::list&lt;T&gt; &amp;list, void *val)
{
    list.push_back(*(T *)val);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1657503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657503</guid><dc:creator><![CDATA[moepmeop]]></dc:creator><pubDate>Tue, 03 Feb 2009 19:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 19:45:49 GMT]]></title><description><![CDATA[<p>Wieso brauchst du eigentlich den Zeiger auf <code>push_back()</code> ? Der Zeiger auf die Liste reicht ja.</p>
<p>Ich denke dabei eher an sowas, könnte das hinkommen? Den Typen <code>T</code> musst du ja kennen, wenn du ein Element einfügen willst.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void PushList(void* List, const T&amp; Value);
{
    static_cast&lt;std::list&lt;T&gt;*&gt;(List)-&gt;push_back(Value);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1657520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657520</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 03 Feb 2009 19:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 19:52:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Den Typen <code>T</code> musst du ja kennen, wenn du ein Element einfügen willst.</p>
</blockquote>
<p>Tobias Harley schrieb:</p>
<blockquote>
<p>ohne explizites Wissen über den Template Parameter</p>
</blockquote>
<p>&amp;Tobias: In welcher Form hast du denn den Funktionszeiger vorliegen? Also mit welchem Typ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657523</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 03 Feb 2009 19:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 19:59:36 GMT]]></title><description><![CDATA[<p>Deswegen sagte ich es ja. Man kann in der Regel kein Objekt pushen, wenn man dessen Typen nicht kennt. Klar, man kann wieder <code>void*</code> anwenden, aber ja... Schlussendlich weiss man gar nichts mehr. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1657527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657527</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 03 Feb 2009 19:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 20:06:28 GMT]]></title><description><![CDATA[<p>Och, ich weiß gar nicht, ob das mit dem unbekannten Typ bei der Übergabe so ein Problem ist, schließlich nimmt list::push_back den Parameter ja per Referenz und nicht per Value. Ich denke eher, dass es am Funktionsaufruf scheitert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657534</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 03 Feb 2009 20:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 21:09:57 GMT]]></title><description><![CDATA[<p>Ist nicht standardkonform und dreckig, aber es funktioniert zumindest unter MSVC++ 2005 in Debug und Release:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;assert.h&gt;
#include &lt;string&gt;
using namespace std;

// Für alles, was mit reinterpret_cast nicht möglich ist:
template&lt;typename U,typename T&gt;
U forbidden_cast( T p )
{
	assert( sizeof(T) == sizeof(U) );

	union Shared
	{
		T p1;
		U p2;
	};

	Shared s;
	s.p1 = p;
	return s.p2;
}

// Führt die push_back-Aktion aus
void makeWeirdPushBackCall( void* plist, void* pfunc, void* pval )
{
	struct Foo {};

    // Als Parameter einfach eine const-Referenz auf irgendwas
	typedef void(Foo::*FooFuncPtr)( const int&amp; );

	FooFuncPtr func = forbidden_cast&lt;FooFuncPtr&gt;( pfunc );
	Foo* foo = static_cast&lt;Foo*&gt;( plist );

    // Die push_back-Funktion aufrufen
	(foo-&gt;*func)( *((int*)pval) );
}

void main()
{
	typedef std::string ValueType;

	std::list&lt;ValueType&gt; f;
	ValueType val = &quot;123&quot;;

	makeWeirdPushBackCall( &amp;f, forbidden_cast&lt;void*&gt;(&amp;std::list&lt;ValueType&gt;::push_back), &amp;val );

    // Liste ausgeben
	cout &lt;&lt; f.size() &lt;&lt; &quot;\n&quot;;
	for ( std::list&lt;ValueType&gt;::const_iterator i=f.begin(); i!=f.end(); ++i )
		cout &lt;&lt; *i &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Ja, es ist dreckig, aber gar nicht so sehr, wie man denken mag. Jedenfalls in Bezug auf das aktuelle Szenario, wo std::list keine virtuellen Funktionen hat und push_back die Standard-Calling-Convention nutzt.</p>
<p>Der Code geht halt davon aus, dass<br />
- der Compiler für die Aufrufe</p>
<pre><code class="language-cpp">std::list&lt;T&gt; l;
l.push_back( ... );
</code></pre>
<p>und</p>
<pre><code class="language-cpp">struct Foo  { void push_back(const int&amp;); };
Foo l;
l.push_back( ... );
</code></pre>
<p>den selben Code erzeugt, dass</p>
<ul>
<li>
<p><code>const T&amp;</code> und <code>const U&amp;</code> für alle <code>T</code> und <code>U</code> gleich repräsentiert werden (z.B. durch 'nen Pointer, afaik gängige Praxis unter den Compilern) und dass</p>
</li>
<li>
<p><code>void(T::*)(const int&amp;)</code> verlust- und gefahrlos in <code>void*</code> konvertiert werden kann und vice versa, dass</p>
</li>
</ul>
<p>- std::list keine virtuellen Funktionen enthält und die Standard Calling-Convention benutzt und</p>
<p>- mehr fällt mir nicht ein.</p>
<p>Aber wie gesagt: Der Code ist <strong>nicht</strong> standard-konform und nur eine Spielerei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657564</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 03 Feb 2009 21:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 23:26:19 GMT]]></title><description><![CDATA[<p>Hey vielen vielen Dank für die schnellen Antworten an euch alle !!!!!<br />
Sehr cooles Forum hier!!!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a>: Hey Alter, vielen Dank für deine Antwort, genau so einen Mechanismus suche ich für mein kleines Reflection System.<br />
Meinst du diese Version funktioniert auch mit dem GNU Compiler? Und ich weiß auch, dass das nicht der schöne Stil ist, aber es hilft mir gerade wirklich weiter <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>vielen Dank an euch alle!!!<br />
gruß Tobber</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657618</guid><dc:creator><![CDATA[Tobias Harley]]></dc:creator><pubDate>Tue, 03 Feb 2009 23:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Tue, 03 Feb 2009 23:34:29 GMT]]></title><description><![CDATA[<p>Tobias Harley schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a>: Hey Alter, vielen Dank für deine Antwort, genau so einen Mechanismus suche ich für mein kleines Reflection System.<br />
Meinst du diese Version funktioniert auch mit dem GNU Compiler? Und ich weiß auch, dass das nicht der schöne Stil ist, aber es hilft mir gerade wirklich weiter <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>
</blockquote>
<p>Gern geschehen, wenn du dein Reflection System fertig hast, kannst du's hier ja auch mal vorstellen <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="🙂"
    /> Ob's mit dem GNU-Compiler klappt, puh, musst du wohl ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657622</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 03 Feb 2009 23:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 05:56:08 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Für alles, was mit reinterpret_cast nicht möglich ist:
template&lt;typename U,typename T&gt;
U forbidden_cast( T p )
{
	assert( sizeof(T) == sizeof(U) );

	union Shared
	{
		T p1;
		U p2;
	};

	Shared s;
	s.p1 = p;
	return s.p2;
}
</code></pre>
</blockquote>
<p>Was ist denn z.B. mit reinterpret_cast nicht möglich?<br />
Und wo ist außer dem assert der wesentliche Unterschied?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657641</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 04 Feb 2009 05:56:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 10:34:17 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Was ist denn z.B. mit reinterpret_cast nicht möglich?<br />
Und wo ist außer dem assert der wesentliche Unterschied?</p>
</blockquote>
<p>Ich hatte es nur kurz ausprobiert, aber die Umwandlung von Member-Function-Pointer nach void* wollte reinterpret_cast nicht machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657731</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 04 Feb 2009 10:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 14:00:32 GMT]]></title><description><![CDATA[<p>hey also das ganze funktioniert echt super mit Visual Studio, leider beendet es der MinGW Compiler mit einer unhandled win32 exception. Aber vielleicht gibt es ja auch noch eine C++ Standart konforme(re) Lösung für dieses Problem, ich würde es gerne kompatibel zu mehreren Compilern halten?</p>
<p>grüsse<br />
Tobber</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657849</guid><dc:creator><![CDATA[Tobias Harley]]></dc:creator><pubDate>Wed, 04 Feb 2009 14:00:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 14:23:20 GMT]]></title><description><![CDATA[<p>Ja, gibt es, über Template-Parameter, ohne üble Hacks. Vielleicht schilderst Du mal, warum Du meinst, diesen Hack zu brauchen. Vielleicht kann man Dich dann davon überzeugen, dass dem nicht so ist. <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/1657870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657870</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 04 Feb 2009 14:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 15:19:46 GMT]]></title><description><![CDATA[<p>Zwischen Datenzeigern (auch void*) und Funktionszeigern zu casten ist in C++ nicht erlaubt. Manche Compiler unterstützen es, aber wie gesagt, erlaubt ist es nicht.</p>
<p>Was spricht gegen die Verwendung von boost::function&lt;&gt; oder ähnlichem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657914</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Feb 2009 15:19:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 15:49:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ja gerne, also ich baue ein kleines Reflection System (oder versuche es), sieht &quot;grob&quot; so aus (ohne syntactic sugar)</p>
<pre><code>class Test : public Object {
public:
    Test();
    ~Test();

private:
    int i;
    list&lt;string&gt; strList;

public:
    void reflect( System* sys ) {
        sys-&gt;addClass( &quot;Test&quot; );
        sys-&gt;addProperty( &quot;i&quot;, TYPE_INTEGER, &amp;i );

        // mein problemkind.
        sys-&gt;addSTLProperty( &quot;strList&quot;, TYPE_STL_LIST, 
             /* zeiger auf container */ 
             &amp;strList, 
             /* Memberfunctionpointer auf void* casten */
             forbidden_cast &lt;void*&gt;( &amp;list&lt;string&gt;::push_back ) );
    }
};
</code></pre>
<p>Nun will ich mit nur einem (void*) Pointer auf eine Instanz (von Test), und der generierten Typinformation, Elemente in meine Lise (strList) einfügen. Was auch mit der von badestrand gezeigten Methode wunderbar funzt, aber leider nur im Visual Studio, der MinGW macht da nich mit.</p>
<p>Ich hoffe das Code-Stück stellt meine Problematik dar.</p>
<p>dank und gruß<br />
Tobber</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657944</guid><dc:creator><![CDATA[Tobias Harley]]></dc:creator><pubDate>Wed, 04 Feb 2009 15:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 17:43:30 GMT]]></title><description><![CDATA[<p>Mal ganz davon abgesehen dass ich nicht glaube dass das so eine gute Idee ist...:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;void&gt; pushBackFunctor(new boost::function&lt;void (int)&gt;(boost::bind(&amp;list&lt;string&gt;::push_back, &amp;strList, _1)));

sys-&gt;addSTLProperty( &quot;strList&quot;, TYPE_STL_LIST, 
             &amp;strList, 
             pushBackFunctor);
</code></pre>
<p>Jetzt castest du Datenzeiger, und das ist erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658019</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Feb 2009 17:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 17:51:03 GMT]]></title><description><![CDATA[<p>BTW: bau dir doch gleich kleine Helper-Templates:</p>
<pre><code class="language-cpp">class WrappedProperty
{
public:
    WrappedProperty(char const* name):
        m_name(name)
    {
    }

    char const* GetName() const { return m_name; }
    virtual int GetTypeCode() const = 0;
private:
    char const* m_name;
};

template &lt;class T&gt; ScalarTypeCodeMap;

template &lt;&gt; ScalarTypeCodeMap&lt;int&gt; {
    static const int TypeCode = 1;
}

template &lt;&gt; ScalarTypeCodeMap&lt;char&gt; {
    static const int TypeCode = 2;
}

// ...

template &lt;class T&gt; WrappedScalar : public WrappedProperty
{
public:
    virtual int GetTypeCode() const { return ScalarTypeCodeMap&lt;T&gt;::TypeCode; }

    T value;
};

class WrappedCollectionProperty : public WrappedProperty
{
public:
    virtual void PopFront() = 0;
    virtual void PopBack() = 0;
    virtual void Clear() = 0;
    virtual size_t GetSize() = 0;
    virtual size_t GetCapacity() = 0;
};

// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1658023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658023</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Feb 2009 17:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 17:53:20 GMT]]></title><description><![CDATA[<p>BZW. noch eine Frage: was willst du mit diesem Reflection-System eigentlich erreichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658026</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Feb 2009 17:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage an STL GURUS!!!!! on Wed, 04 Feb 2009 18:02:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>BZW. noch eine Frage: was willst du mit diesem Reflection-System eigentlich erreichen?</p>
</blockquote>
<p>Frage ich mich gerade auch.. Wenn man da sowieso alles von Hand eintragen muss ist der Spass ja weg..</p>
<p>Ich denke mal, das man das mit Typlisten automatisch erledigen kann, allerdings wäre die Klassenerzeugung so etwas von umständlich und unhandlich, dass man es eigl. glatt vergessen kann..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1658038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1658038</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 04 Feb 2009 18:02:27 GMT</pubDate></item></channel></rss>