<?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[Wie speichert ihr besitzende Zeiger in Containern?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Obwohl es sich um eine relativ oft benötigte Funktionalität handelt, bietet C++ auch im neuen Standard nichts Entsprechendes an: Pointer-Container, die besitzende Zeiger exceptionsicher speichern und automatisch freigeben. Der Hauptanwendungszweck sind polymorphe und nichtkopierbare Klassen, die bisher nicht direkt in STL-Containern gespeichert werden können. C++0x geht zwar mit Move-Semantik und <code>std::unique_ptr</code> einen Schritt in jene Richtung, aber einiges kann mit spezialisierten Pointer-Containern immer noch besser gelöst werden.</p>
<p>Ich persönlich habe für solche Zwecke bisher meist <a href="http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">Boost.PointerContainer</a> benutzt. Grundsätzlich finde ich die Bibliothek nicht schlecht, aber gewisse Dinge gefallen mir daran nicht besonders. Vor allem ist das Debuggen von solchen Pointer-Containern die reinste Qual, da man nach 7 Indirektionen vor einem <code>void*</code> steht und somit die eigentlichen Werte der Elemente immer noch nicht sieht. Eben bin ich auf <a href="http://stackoverflow.com/questions/4532109/is-there-an-easy-way-to-make-boostptr-vector-more-debugger-friendly-in-visual" rel="nofollow">etwas recht Vielversprechendes</a> gestossen, damit könnte die Debug-Anzeige in Visual Studio schön werden. Dennoch interessieren mich allfällige Alternativen.</p>
<p>Was verwendet ihr, wenn ihr z.B. polymorphe Objekte in einem Container speichern wollt? Kennt ihr andere Implementierungen für Pointer-Container als die von Boost? Oder habt ihr selbst was geschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291595/wie-speichert-ihr-besitzende-zeiger-in-containern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 15:31:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291595.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Aug 2011 13:05:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 13:05:46 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Obwohl es sich um eine relativ oft benötigte Funktionalität handelt, bietet C++ auch im neuen Standard nichts Entsprechendes an: Pointer-Container, die besitzende Zeiger exceptionsicher speichern und automatisch freigeben. Der Hauptanwendungszweck sind polymorphe und nichtkopierbare Klassen, die bisher nicht direkt in STL-Containern gespeichert werden können. C++0x geht zwar mit Move-Semantik und <code>std::unique_ptr</code> einen Schritt in jene Richtung, aber einiges kann mit spezialisierten Pointer-Containern immer noch besser gelöst werden.</p>
<p>Ich persönlich habe für solche Zwecke bisher meist <a href="http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">Boost.PointerContainer</a> benutzt. Grundsätzlich finde ich die Bibliothek nicht schlecht, aber gewisse Dinge gefallen mir daran nicht besonders. Vor allem ist das Debuggen von solchen Pointer-Containern die reinste Qual, da man nach 7 Indirektionen vor einem <code>void*</code> steht und somit die eigentlichen Werte der Elemente immer noch nicht sieht. Eben bin ich auf <a href="http://stackoverflow.com/questions/4532109/is-there-an-easy-way-to-make-boostptr-vector-more-debugger-friendly-in-visual" rel="nofollow">etwas recht Vielversprechendes</a> gestossen, damit könnte die Debug-Anzeige in Visual Studio schön werden. Dennoch interessieren mich allfällige Alternativen.</p>
<p>Was verwendet ihr, wenn ihr z.B. polymorphe Objekte in einem Container speichern wollt? Kennt ihr andere Implementierungen für Pointer-Container als die von Boost? Oder habt ihr selbst was geschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109118</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Aug 2011 13:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 13:13:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p><code>boost.ptr_container</code> . Wenns ans Debuggen geht, kann man eigentlich immer über den Callstack zur problematischen Stelle zurückspringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109128</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 22 Aug 2011 13:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 18:18:37 GMT]]></title><description><![CDATA[<p>Okay. Boost.PtrContainer ist wahrscheinlich das bekannteste...</p>
<p>Naja, im Debugger sieht man halt dennoch die Elemente nicht. Aber ich hab jetzt die Visualizer installiert, damit ist das Debuggen doch recht viel angenehmer (bzw. überhaupt erst möglich). Hätte ich schon früher tun sollen <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109262</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Aug 2011 18:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 19:22:56 GMT]]></title><description><![CDATA[<p>Ich habe immer noch die vergebliche Hoffnung, dass dies mal wahr wird:<br />
<a href="http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html#future-developments" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html#future-developments</a></p>
<blockquote>
<p>There are indications that the <code>void*</code> implementation has a slight performance overhead compared to a <code>T*</code> based implementation. Furthermore, a <code>T*</code> based implementation is so much easier to use type-safely with algorithms. Therefore I anticipate to move to a <code>T*</code> based implementation.</p>
</blockquote>
<p>Aber das steht nun schon verdammt LANGE da!</p>
<p>Ansonsten schon Wrapper verwendet oder sowas hier:<br />
<a href="http://www.boost.org/doc/libs/1_47_0/libs/utility/checked_delete.html" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/utility/checked_delete.html</a><br />
+<br />
<code>std::for_each</code></p>
<p>Gesamthaft muss ich sagen: Nichts befriedigendes.<br />
C++0x kommt bei mir noch kaum zum Einsatz.</p>
<p>Was stört dich eigentlich an einem <code>std::vector&lt;std::unique_ptr&lt;T&gt;&gt;</code> ?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109299</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 22 Aug 2011 19:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 19:48:00 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<blockquote>
<p>There are indications that the <code>void*</code> implementation has a slight performance overhead compared to a <code>T*</code> based implementation.</p>
</blockquote>
</blockquote>
<p>Wieso denn? ob void* oder T*, im laufenden Programm sollte es da doch keinen Unterschied geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109304</guid><dc:creator><![CDATA[Cachus]]></dc:creator><pubDate>Mon, 22 Aug 2011 19:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 20:47:16 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ich habe immer noch die vergebliche Hoffnung, dass dies mal wahr wird</p>
</blockquote>
<p>Wahrscheinlich haben sie <code>void*</code> gewählt, um den Template-Bloat in Grenzen zu halten. Für jeden Typen neue Instanziierungen zu erstellen, obwohl die Zeiger alle gleich behandelt werden, ist ja wirklich sinnlos. Und im Prinzip hat Cachus Recht, das ist ein Implementierungsdetail. Höchstens für den Debugger ist es relevant, aber selbst mit <code>T*</code> wäre das noch extrem benutzerunfreundlich. Aber hier habe ich ja eine Lösung.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ansonsten schon Wrapper verwendet</p>
</blockquote>
<p>Um <code>std::vector&lt;T*&gt;</code> und Co., oder wie sieht das bei dir aus?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Was stört dich eigentlich an einem <code>std::vector&lt;std::unique_ptr&lt;T&gt;&gt;</code> ?</p>
</blockquote>
<p>Vor allem die zusätzliche Indirektion beim Element- und Iteratorzugriff sowie die Notwendigkeit, alle Objekte erst in Smart-Pointer zu packen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109343</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Aug 2011 20:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 21:06:01 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Vor allem die zusätzliche Indirektion beim Element- und Iteratorzugriff sowie die Notwendigkeit, alle Objekte erst in Smart-Pointer zu packen.</p>
</blockquote>
<p>Das hat aber den Vorteil, dass der Code direkt ausdrückt, was er tut, und somit verständlicher wird. Zumindest meiner Meinung nach.<br />
Die automatische Dereferenzierung bei den <code>boost.pointer*</code> -Teilen finde ich eher suspekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109365</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 22 Aug 2011 21:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Mon, 22 Aug 2011 21:17:52 GMT]]></title><description><![CDATA[<p>Ich finde die direkte Dereferenzierung im Hinblick auf Abstraktion gut. In erster Linie will ich ja Objekte speichern – dass ich dafür Zeiger verwende, ist vor allem eine technische Angelegenheit (z.B. um Slicing zu verhindern). Im Weiteren sind Nullzeiger standardmässig verboten, ich habe also nicht wirklich viel von diesem Wissen. Gerade mit Move-Semantik verschwimmen die Grenzen noch mehr, da ein Objekt keinen festen Platz mehr hat.</p>
<p>Ohne diese Dereferenzierung müsste man generischen Code verdoppeln, einmal für STL-Container und einmal für Boost-Pointer-Container. Oder immer irgendwelche Umwandler benutzen. Man könnte nicht von einem <code>std::vector&lt;T&gt;</code> auf <code>boost::ptr_vector&lt;T&gt;</code> wechseln, ohne sämtlichen Anwendercode anzupassen. Nun muss man das hauptsächlich noch an den Stellen, wo man neue Elemente einfügt. Ausserdem sind STL-Algorithmen mühsam auf Zeigern anzuwenden, vor allem wenn man schon fertige Funktoren hat, die mit Referenzen arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109376</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 22 Aug 2011 21:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Tue, 23 Aug 2011 09:44:44 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ich habe immer noch die vergebliche Hoffnung, dass dies mal wahr wird</p>
</blockquote>
<p>Wahrscheinlich haben sie <code>void*</code> gewählt, um den Template-Bloat in Grenzen zu halten. Für jeden Typen neue Instanziierungen zu erstellen, obwohl die Zeiger alle gleich behandelt werden, ist ja wirklich sinnlos.</p>
</blockquote>
<p>Wird sowieso passieren. Problem ist der zugrunde liegende Container. Die Boost Pointer Container sind eigentlich nur Wrapper. Sieh dir mal die Deklaration von <code>boost::ptr_vector</code> an:</p>
<pre><code class="language-cpp">template
    &lt; 
        class T, 
        class CloneAllocator = heap_clone_allocator,
        class Allocator      = std::allocator&lt;void*&gt;
    &gt;
    class ptr_vector : public ptr_sequence_adapter
                              &lt;
                                  T,
                                  std::vector&lt;void*,Allocator&gt;,
                                  CloneAllocator
                              &gt;
</code></pre>
<p>Wieso wird da ein <code>std::vector&lt;void*,Allocator&gt;</code> verwendet statt eines <code>std::vector&lt;T*,Allocator&gt;</code> ? Wenn du dir den Code dann weiter anschaust, findest du überall <code>static_cast</code> . Natürlich schön weggekapselt (also der Typ, welcher das programmiert hat, hat schon was drauf), aber wieso er sich für <code>void*</code> entschieden hat, ist mir ein absolutes Rätsel. Macht die Sache eigentlich nur unnötig komplizierter.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Und im Prinzip hat Cachus Recht, das ist ein Implementierungsdetail. Höchstens für den Debugger ist es relevant, aber selbst mit <code>T*</code> wäre das noch extrem benutzerunfreundlich. Aber hier habe ich ja eine Lösung.</p>
</blockquote>
<p>Nicht ganz. Man kann an die zugrunde liegende Container rankommen. Sie sind somit ein Teil der Schnittstelle und somit kein Implementierungsdetail mehr. Und dort findest du dann alles <code>void*</code> Zeiger vor.</p>
<p>Frag mich jetzt nicht, wieso ich mal da ran wollte, ich weiss es nicht mehr. Ich weiss nur noch, dass es aus irgendeinem Grund nicht anders ging <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>
<p>Und benutzerunfreundlich finde ich es auch nicht. Du musst nur in <code>boost::ptr_container_detail::reversible_ptr_container</code> an die private Variable <code>_c</code> ran. Das ist der Container, welcher gewrappt wurde. Wenn da keine <code>void*</code> Zeiger drin wären, wäre es kein Problem.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ansonsten schon Wrapper verwendet</p>
</blockquote>
<p>Um <code>std::vector&lt;T*&gt;</code> und Co., oder wie sieht das bei dir aus?</p>
</blockquote>
<p>Ja, grundsätzlich ähnlich, wie es Boost Pointer Container macht, nur halt einfacher und auf meine Bedürfnisse zugeschnitten.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109537</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 23 Aug 2011 09:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Tue, 23 Aug 2011 10:25:56 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>[Template Bloat] Wird sowieso passieren. Problem ist der zugrunde liegende Container. Die Boost Pointer Container sind eigentlich nur Wrapper.</p>
</blockquote>
<p>Naja, zumindest auf unterster Ebene werden <code>void*</code> in STL-Containern gespeichert. Ich kann jetzt schlecht einschätzen, wie weit man die Type Erasure durchziehen kann, vielleicht wäre noch mehr möglich gewesen. Aber wenn man Bloat vermeiden kann, finde ich <code>void*</code> gut, zumal es normalerweise völlig vom Benutzer abgekapselt ist.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Und benutzerunfreundlich finde ich es auch nicht. [...] Wenn da keine <code>void*</code> Zeiger drin wären, wäre es kein Problem.</p>
</blockquote>
<p>Okay, hier mal die Debug-Anzeige von <code>boost::ptr_map</code> :</p>
<ul>
<li><strong>map</strong> boost::ptr_map&lt;int,Base,std::less&lt;int&gt;,boost::heap_clone_allocator,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;</li>
<li>boost::ptr_map_adapter&lt;Base,std::map&lt;int,void *,std::less&lt;int&gt;,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;,boost::heap_clone_allocator,1&gt;</li>
<li>boost::ptr_container_detail::ptr_map_adapter_base&lt;Base,std::map&lt;int,void *,std::less&lt;int&gt;,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;,boost::heap_clone_allocator,1&gt;</li>
<li>boost::ptr_container_detail::associative_ptr_container&lt;boost::ptr_container_detail::map_config&lt;Base,std::map&lt;int,void *,std::less&lt;int&gt;,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;,1&gt;,boost::heap_clone_allocator&gt;</li>
<li>boost::ptr_container_detail::reversible_ptr_container&lt;boost::ptr_container_detail::map_config&lt;Base,std::map&lt;int,void *,std::less&lt;int&gt;,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;,1&gt;,boost::heap_clone_allocator&gt;</li>
<li><strong>c_</strong> std::map&lt;int,void *,std::less&lt;int&gt;,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;</li>
<li><strong>[0]</strong> std::pair&lt;int const ,void *&gt;</li>
</ul>
<p>Kein Problem? Mit der Benutzerfreundlichkeit ist es spätestens nach drei Indirektionen vorbei. Und es sind <strong>sieben</strong>! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Was interessieren mich <code>ptr_map_adapter</code> , <code>ptr_map_adapter_base</code> , <code>associative_ptr_container</code> , <code>reversible_ptr_container</code> und <code>std::map</code> und all deren Templateparameter? Ich will direkt auf die relevanten Member von <code>boost::ptr_map</code> zugreifen. Mit den Visualizers geht das sehr schön, das ganze Geboostel wird wegabstrahiert:</p>
<ul>
<li><strong>map</strong> boost::ptr_map&lt;int,Base,std::less&lt;int&gt;,boost::heap_clone_allocator,std::allocator&lt;std::pair&lt;int const ,void *&gt; &gt; &gt;</li>
<li><strong>[0]</strong> std::pair&lt;int,Base *&gt;</li>
</ul>
<p>Dravere schrieb:</p>
<blockquote>
<p>Man kann an die zugrunde liegende Container rankommen. Sie sind somit ein Teil der Schnittstelle und somit kein Implementierungsdetail mehr. Und dort findest du dann alles void* Zeiger vor.</p>
</blockquote>
<p>Bis zur untersten Ebene? Darüber scheint ja alles mit <code>T*</code> abzulaufen. Aber ich kann mir nicht vorstellen, wozu man das möchte. Vielleicht haben sie es angeboten, um maximale Flexibilität zu ermöglichen, aber aus Abstraktionssicht ist das sicher nicht klug. Zumal sie so die Implementierung nicht ändern können, ohne Benutzercode kaputt zu machen. Von mir aus können sie ruhig überall <code>void*</code> verwenden, solange das Interface sauber bleibt und ich vernünftig debuggen kann. Wenn dadurch der erzeugte Code kleiner wird, umso besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109548</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Aug 2011 10:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Tue, 23 Aug 2011 13:26:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Okay, hier mal die Debug-Anzeige von <code>boost::ptr_map</code></p>
</blockquote>
<p>Musstest natürlich gleich etwas vom schlimmsten nehmen. Ich habe halt bisher eher mit <code>boost::ptr_vector</code> gearbeitet. Da sind es deutlich weniger. Aber ist eigentlich auch egal. Ich arbeite in VS oft mit dem Immediate Fenster zusammen, um Werte zu analysieren. Da ist es völlig egal, wieviele Basisklassen das Ding hat. Wenn du z.B. einen <code>boost::ptr_vector vec</code> hast, dann gibst du im Immediate Fenster einfach <code>vec.c_</code> ein. Schon hast du alle Werte, welche sich im vec.c_ Container befinden. Kannst auch auf ein einzelnes Element zugreifen: <code>vec.c_._Myfirst[0]</code> . Bringt aber natürlich nichts, weil es ein <code>void*</code> Zeiger ist und somit erhälst du nur den Zeigerwert.</p>
<p>Aber gut, jeder wie er mag <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>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Man kann an die zugrunde liegende Container rankommen. Sie sind somit ein Teil der Schnittstelle und somit kein Implementierungsdetail mehr. Und dort findest du dann alles void* Zeiger vor.</p>
</blockquote>
<p>Bis zur untersten Ebene? Darüber scheint ja alles mit <code>T*</code> abzulaufen. Aber ich kann mir nicht vorstellen, wozu man das möchte. Vielleicht haben sie es angeboten, um maximale Flexibilität zu ermöglichen, aber aus Abstraktionssicht ist das sicher nicht klug. Zumal sie so die Implementierung nicht ändern können, ohne Benutzercode kaputt zu machen. Von mir aus können sie ruhig überall <code>void*</code> verwenden, solange das Interface sauber bleibt und ich vernünftig debuggen kann. Wenn dadurch der erzeugte Code kleiner wird, umso besser.</p>
</blockquote>
<p>Man kommt z.B. an den Container ran, welcher gewrappt wurde:<br />
<a href="http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/reversible_ptr_container.html#modifiers" rel="nofollow">http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/reversible_ptr_container.html#modifiers</a></p>
<blockquote>
<p><code>VoidPtrContainer&amp; base();</code><br />
<code>const VoidPtrContainer&amp; base() const;</code><br />
Returns: a reference to the wrapped container</p>
</blockquote>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109634</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 23 Aug 2011 13:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Tue, 23 Aug 2011 21:53:31 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Musstest natürlich gleich etwas vom schlimmsten nehmen.</p>
</blockquote>
<p>Ja, schliesslich habe ich auch schon mit <code>boost::ptr_map</code> gearbeitet. Ist ohnehin etwas gewöhnungsbedürftig, ich mag z.B. die Referenzübergabe für den Key nicht (auch wenn sie für Exceptionsicherheit notwendig ist). Etwas schade, da Key-Kopien bei mir eigentlich nie Exceptions werfen.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Aber gut, jeder wie er mag <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>Hast du nicht auch vor, in Zukunft diese Visualizers zu verwenden? Ich finde sie wirklich sehr nützlich. Ich fahre z.B. ab und zu mit der Maus über eine Variable, um ihren Wert anzuschauen. Da zahlt es sich aus, nicht 6 mal ein neues Untermenü aufklappen zu müssen, um nachher die <code>void*</code> zu begutachten <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="😉"
    /></p>
<p>Aber zurück zum eigentlichen Thema: Kennt jemand andere Implementierungen für Pointer-Container als die von Boost? Oder gibt es weitere Leute, die sich Wrapper schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109862</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 23 Aug 2011 21:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Wed, 24 Aug 2011 13:20:03 GMT]]></title><description><![CDATA[<p>Ich verwende bisher nur einmal einen boost::ptr_vector&lt;abc&gt; zwecks Polymorphie. Das würde aber genauso mit std::vector&lt;unique_ptr&lt;abc&gt; &gt; auch funktionieren. Von der Standardbibliothek nutze ich aber ungern C++0x Features. Deswegen ist es bei diesem einen Male ein boost::ptr_vector geworden.</p>
<p>Dass ich die ptr_vector-Iteratoren nicht doppelt dereferenzieren muss, um an das abc-Objekt zu kommen, finde ich gut. Aber super wichtig ist das jetzt auch nicht. Im Notfall gibt es so Dinge wie boost::indirect_iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110117</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 24 Aug 2011 13:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie speichert ihr besitzende Zeiger in Containern? on Wed, 24 Aug 2011 21:44:57 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Von der Standardbibliothek nutze ich aber ungern C++0x Features.</p>
</blockquote>
<p>Wegen unausgereifter Implementierungen bzw. möglicher Bugs? Ich selbst verwende hauptsächlich die Dinge, die es im TR1 schon gab ( <code>function</code> , <code>bind</code> , <code>array</code> , <code>shared_ptr</code> ). Aber ich kenne viele Neuerungen auch gar nicht. Aber die Threading-Sachen muss ich mir unbedingt einmal anschauen.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Im Notfall gibt es so Dinge wie boost::indirect_iterator.</p>
</blockquote>
<p>Klar, aber der direkte Weg scheint mir dennoch intuitiver. Und wie erwähnt ist generischer Code wahrscheinlich etwas einfacher zu schreiben.</p>
<p>Danke auch für deinen Beitrag! Weitere Meinungen sind natürlich gerne gesehen <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/2110377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110377</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Aug 2011 21:44:57 GMT</pubDate></item></channel></rss>