<?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[wahl des richtigen smartpointer]]></title><description><![CDATA[<p>hi</p>
<p>welcher smartpointer muss ich wählen damit bei jeder zuweisung des smartpointers eine neue instants erzeugt wird auf dem heap (also so dass jeder pointer immer seine eigene instanz hat)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320833/wahl-des-richtigen-smartpointer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 14:06:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320833.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Oct 2013 07:25:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 07:25:19 GMT]]></title><description><![CDATA[<p>hi</p>
<p>welcher smartpointer muss ich wählen damit bei jeder zuweisung des smartpointers eine neue instants erzeugt wird auf dem heap (also so dass jeder pointer immer seine eigene instanz hat)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360097</guid><dc:creator><![CDATA[not smart]]></dc:creator><pubDate>Mon, 14 Oct 2013 07:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 07:27:06 GMT]]></title><description><![CDATA[<p>Keinen oO</p>
<p>Der einzige der halbwegs nah an deine Verlangen drankommt wäre shared_ptr, aber auch der arbeitet anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360098</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 14 Oct 2013 07:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 08:51:02 GMT]]></title><description><![CDATA[<p>Es gibt hier und da Vorschläge, so etwas als neue Datentypfamilie in den <code>std</code> -Namensraum einzuführen. In C++11 gibt es so etwas noch nicht.</p>
<p>Wofür möchtest du das denn nutzen? Ich sehe folgende Vorteile, warum man etwas so kapseln wollte:</p>
<ul>
<li>Optimierung von Move (für &quot;unhandliche Typen&quot;)</li>
<li>Optimierung von Copy (lazy per copy-on-write)</li>
<li>Unterstützung von Polymorphie (per Indirektion)</li>
</ul>
<p>wobei sich copy-on-write und Polymorphie nicht so einfach kombinieren lässt.</p>
<p>Einen Wrapper <code>cow&lt;&gt;</code> , der copy-on-write macht, kann man relativ leicht per <code>std::shared_ptr</code> implementieren. Dieser Wrapper bietet <code>read()</code> / <code>write()</code> Methoden an, für Lese- und Schreibzugriff, wobei in <code>write</code> dann der shared_ptr auf <code>unique</code> ness geprüft wird und das referenzierte Objekt ggf kopiert wird.</p>
<p>Für den Polymorphie-Fall kann man sich relativ leicht ein <code>clone_ptr&lt;&gt;</code> bauen, der eine virtuelle clone-Funktion zum Kopieren aufruft.</p>
<p>Wenn du keine Lust hast, ein eigenes Klassentemplate für sowas zu verwenden, dann kannst du auch <code>unique_ptr</code> nehmen, musst dann aber in den Fällen, wo du eine Kopie brauchst, selbst Hand anlegen:</p>
<pre><code class="language-cpp">unique_ptr&lt;int&gt; x {new int{23}};
unique_ptr&lt;int&gt; y = x; // kompiliert ja bei unique_ptr nicht!
unique_ptr&lt;int&gt; z {new int{*x}};
</code></pre>
<p>Natürlich macht das für <code>int</code> wenig Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360119</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Oct 2013 08:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 09:07:00 GMT]]></title><description><![CDATA[<p><a href="http://www.bromeon.ch/libraries/aurora/v1.0/tutorial-smartptr.html" rel="nofollow">aurora::CopiedPtr</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360122</guid><dc:creator><![CDATA[Aurorer]]></dc:creator><pubDate>Mon, 14 Oct 2013 09:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 09:11:45 GMT]]></title><description><![CDATA[<p>Schreib selbst einen.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;utility&gt;

using namespace std;

template&lt;class ValueType&gt;
struct Copy_ptr{
	Copy_ptr(ValueType *nt) : value(nt){
	}
	~Copy_ptr(){
		delete value;
	}
	Copy_ptr(const Copy_ptr&lt;ValueType&gt; &amp;other){
		value = new ValueType(*other); //Die einzige wichtige Zeile, Rest ist blabla
	}
	Copy_ptr(Copy_ptr&lt;ValueType&gt; &amp;&amp;other) : value(0){
		swap(value, other.value);
	}
	ValueType &amp;operator *(){
		return *value;
	}
	const ValueType &amp;operator *() const{
		return *value;
	}
	ValueType *&amp;operator -&gt;(){
		return value;
	}
	const ValueType *&amp;operator -&gt;() const{
		return value;
	}
	const ValueType &amp;operator =(const Copy_ptr&lt;ValueType&gt; &amp;other){
		return *value = *other;
	}
	const ValueType &amp;operator =(Copy_ptr&lt;ValueType&gt; &amp;&amp;other){
		swap(value, other.value);
		return *value;
	}
private:
	ValueType *value;
};

int main(){
	Copy_ptr&lt;string&gt; cps(new string(&quot;Hallo&quot;));
	cout &lt;&lt; &quot;size(\&quot;&quot; &lt;&lt; *cps &lt;&lt; &quot;\&quot;) = &quot; &lt;&lt; cps-&gt;size() &lt;&lt; '\n';
	Copy_ptr&lt;string&gt; cps2 = cps;
	cout &lt;&lt; *cps2 &lt;&lt; '\n';
	*cps2 = &quot;Welt&quot;;
	cout &lt;&lt; *cps &lt;&lt; *cps2 &lt;&lt; '\n';
}
</code></pre>
<p>Funktioniert nicht mit arrays. Setzt voraus, dass ValueType einen Copy-Konstruktor hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360124</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Mon, 14 Oct 2013 09:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 17:24:59 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>//Die einzige wichtige Zeile, Rest ist blabla</p>
</blockquote>
<p>Viel zu viel Code.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct dup_policy {
  std::unique_ptr&lt;T&gt; dup(T const&amp; x) { return x.clone(); }
};
template &lt;typename T&gt;
struct copy_policy {
  std::unique_ptr&lt;T&gt; dup(T const&amp; x) { return std::unique_ptr&lt;T&gt;(new T(x)); }
};

template &lt;class T, class DupPolicy=copy_policy&lt;T&gt; &gt;
struct copy_ptr : private DupPolicy, private std::unique_ptr&lt;T&gt; {
  using std::unique_ptr&lt;T&gt;::unique_ptr;
  using std::unique_ptr&lt;T&gt;::operator*;
  using std::unique_ptr&lt;T&gt;::operator-&gt;;
  copy_ptr(const copy_ptr&lt;T&gt; &amp;o)
    : std::unique_ptr&lt;T&gt;(static_cast&lt;DupPolicy&gt;(*this).dup(*o)) {}
  copy_ptr&amp; operator=(copy_ptr&lt;T&gt;&amp;&amp;)=default;
  copy_ptr&amp; operator=(const copy_ptr&lt;T&gt; &amp;o)
  { return *this = copy_ptr(o); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2360261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360261</guid><dc:creator><![CDATA[c++11!forever!!111!1!]]></dc:creator><pubDate>Mon, 14 Oct 2013 17:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 21:09:57 GMT]]></title><description><![CDATA[<p>Die Idee mit der dup_policy ist nett, aber intrusive.<br />
Ich würde hier eher an etwas analog zum &quot;deleter&quot; eines <code>shared_ptr</code> denken. Also ein &quot;copier&quot;. Der genau so wie bei <code>shared_ptr</code> nicht in den Typ des Zeigers eingeht.</p>
<p>Damit wird's natürlich gleich ein schönes Stück komplizierter. Dafür mMn. auch ein schönes Stück einfacher zu verwenden.</p>
<p>Und den Overhead der 2. Allokation kann man genau wie bei <code>shared_ptr</code> durch eine <code>make_shared</code> -artige Funktion vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360320</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 14 Oct 2013 21:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 21:28:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Idee mit der dup_policy ist nett, aber intrusive.<br />
Ich würde hier eher an etwas analog zum &quot;deleter&quot; eines <code>shared_ptr</code> denken. Also ein &quot;copier&quot;. Der genau so wie bei <code>shared_ptr</code> nicht in den Typ des Zeigers eingeht.</p>
</blockquote>
<p>Sehe ich nicht so, bei shared_ptr wird erwartungsgemäss sehr selten delete aufgerufen, bei unique_ptr sehr oft. Deshalb ist der deleter bei unique_ptr intrusive. copy_ptr ruft erfahrungsgemäss sehr oft copy auf, deshalb hätte ich das am liebsten ohne Overhead.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Damit wird's natürlich gleich ein schönes Stück komplizierter. Dafür mMn. auch ein schönes Stück einfacher zu verwenden.</p>
</blockquote>
<p>Mit einem default_dup_policy_trait könnte man umgehen, dass die Policy in der Praxis explizit angegeben werden muss.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Und den Overhead der 2. Allokation kann man genau wie bei <code>shared_ptr</code> durch eine <code>make_shared</code> -artige Funktion vermeiden.</p>
</blockquote>
<p>Was für eine 2. Allokation?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360326</guid><dc:creator><![CDATA[c++11!forever!!111!1!]]></dc:creator><pubDate>Mon, 14 Oct 2013 21:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 22:08:41 GMT]]></title><description><![CDATA[<p>Für mich stellt sich die Frage, wozu so ein <code>copy_ptr</code> gut sein soll, wenn er nicht mit &quot;derived class&quot; Objekten klarkommt.<br />
D.h. die Default-Variante sollte mMn. damit klarkommen.<br />
(Oder gibt's da wichtige Anwendungsmöglichkeiten die ich übersehe?)<br />
Also...</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Damit wird's natürlich gleich ein schönes Stück komplizierter. Dafür mMn. auch ein schönes Stück einfacher zu verwenden.</p>
</blockquote>
<p>Mit einem default_dup_policy_trait könnte man umgehen, dass die Policy in der Praxis explizit angegeben werden muss.</p>
</blockquote>
<p>...braucht man ne Default-Policy die polymorph &quot;klonen&quot; kann. Nur kann man dummerweise in C++ beliebige Klassen nicht einfach so klonen. Also muss man es irgendwie anders machen.<br />
Deine Variante, also eine &quot;clone()&quot; Memberfunktion mit genau diesem Namen zu verlangen, ist intrusive. Finde ich also nicht so gut.</p>
<p>Wenn dann könnte ich mir noch eher folgende &quot;dup_policy&quot; vorstellen, analog zu dem was <code>boost::intrusive_ptr</code> macht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct dup_policy {
  std::unique_ptr&lt;T&gt; dup(T const&amp; x)
  {
     // Keine Default-Implementierung von copy_ptr_clone(), wird ggf. über ADL gefunden
     return std::unique_ptr&lt;T&gt;(copy_ptr_clone(x));
  }
};
</code></pre>
<p>Und diese sollte mMn. dann Default sein.<br />
Alternativ könnte man ein Concept-artiges Hilfs-Klassentemplate verwenden das man für den zu klonenden Typ spezialisieren muss.</p>
<p>Ansonsten halte ich den Overhead beim Aufruf der Clone-Funktion auch mit Copier für durchaus vertretbar. Das ist ein zusätzlicher virtual Call, damit kann man sicher leben. So nen Zeiger wird man ja wohl nicht für Integers o.ä. verwenden. Die 2. Allokation fände ich da viel schlimmer.</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Und den Overhead der 2. Allokation kann man genau wie bei <code>shared_ptr</code> durch eine <code>make_shared</code> -artige Funktion vermeiden.</p>
</blockquote>
<p>Was für eine 2. Allokation?</p>
</blockquote>
<p>Na der Copier muss ja irgendwo gespeichert werden. Siehe <code>shared_ptr</code> , der macht auch ne 2. Allokation für den Deleter wenn man nicht <code>make_shared</code> verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360340</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 14 Oct 2013 22:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 22:18:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Für mich stellt sich die Frage, wozu so ein copy_ptr gut sein soll, wenn er nicht mit &quot;derived class&quot; Objekten klarkommt.</p>
</blockquote>
<p>Wie meinst du das? Zeiger auf Basisklassen sind Zeiger auf Basisklassen. Du kannst natürlich einen Kopierkonstruktor für <code>copy_ptr&lt;Derived&gt;</code> definieren, der einen <code>copy_ptr&lt;Base&gt;</code> nimmt und auf<br />
dessen Inhalt <code>dynamic_cast&lt;Derived&amp;&gt;(*other.get())</code> anwendet.<br />
Aber du solltest nicht erwarten, dass ein <code>copy_ptr&lt;Base&gt;</code> einen anderen <code>copy_ptr&lt;Base&gt;</code> so kopiert, dass die tatsächlichen <em>most-derived-object</em>s kopiert werden.</p>
<blockquote>
<p>Deine Variante, also eine &quot;clone()&quot; Memberfunktion mit genau diesem Namen zu verlangen, ist intrusive. Finde ich also nicht so gut.</p>
</blockquote>
<p>Du kannst natürlich mit Type-Erasure etwas schönes basteln. Also eine virtuelle clone()-Funktion eines Wrappers. Das ganze stelle ich mir so *ganz grob* vor</p>
<pre><code>template&lt;typename T&gt;
struct clone_ptr
{
    T* ptr;

    struct WrapperBase
    {
        virtual clone_ptr&lt;T&gt; clone(T*) = 0;
    }* mWrapper;

    template&lt;typename Derived&gt;
    struct Wrapper : WrapperBase
    {
        virtual clone_ptr&lt;T&gt; clone(T* ptr) { return new Derived(dynamic_cast&lt;Derived&amp;&gt;(*ptr)); }
    };

    template&lt;typename T2,
             typename = typename std::enable_if&lt;std::is_base_of&lt;T, T2&gt;::value&gt;::type&gt;
    clone_ptr( T2* c ):
        ptr{c},
        mWrapper{ new Wrapper&lt;T2&gt; ) {}
};
</code></pre>
<p>Bin aber schon sehr müde und sehe mir das morgen Nachmittag genauer an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360343</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 14 Oct 2013 22:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Mon, 14 Oct 2013 23:09:00 GMT]]></title><description><![CDATA[<p>Ein klassischer &quot;ich weiss was!!!11elf&quot; Beitrag von unserem liebsten &quot;ich weiss was!!!11elf&quot; User. *sigh*</p>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Für mich stellt sich die Frage, wozu so ein copy_ptr gut sein soll, wenn er nicht mit &quot;derived class&quot; Objekten klarkommt.</p>
</blockquote>
<p>Wie meinst du das? Zeiger auf Basisklassen sind Zeiger auf Basisklassen.<br />
(*snip-nonsense*)</p>
</blockquote>
<p>Ach watt!</p>
<p>Wenn ich einen <code>copy_ptr&lt;Base&gt;</code> habe, wo ein <code>Derived</code> drinnen steckt, und ich kopiere mir daraus einen 2. <code>copy_ptr&lt;Base&gt;</code> , dann soll da wieder ein <code>Derived</code> drin stecken.</p>
<blockquote>
<p>Du kannst natürlich mit Type-Erasure etwas schönes basteln.</p>
</blockquote>
<p>Wenn du den Thread aufmerksam gelesen hättest, wäre dir vielleicht aufgefallen, dass das mein 1. Vorschlag war.</p>
<blockquote>
<p>Also eine virtuelle clone()-Funktion eines Wrappers. Das ganze stelle ich mir so *ganz grob* vor<br />
(*snip*)</p>
</blockquote>
<p>*sigh*<br />
Ja, ich denke die meisten hier wissen wie man sowas angeht.<br />
Und eine nichtmal 1/2-fertige Lösung ist wohl kaum interessant.</p>
<p>Davon abgesehen kann eine Klasse die (ausser einer Memberfunktion) nichts enthält wohl auch nichts &quot;Wrappen&quot;.<br />
=&gt; Cloner, Copier, aber sicher nicht Wrapper.<br />
Und der <code>dynamic_cast</code> ist auch problematisch. Erstens wollen wir für den ja nicht bezahlen, und zweitens wollen wir von <code>T</code> auch nicht verlangen dass es polymorph sein <em>muss</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360351</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 14 Oct 2013 23:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 09:56:19 GMT]]></title><description><![CDATA[<p>Wozu zerbrecht ihr euch den Kopf? Ich habe oben einen Link zu einer Bibliothek gepostet, die eine fertige Implementierung für einen Smart-Pointer mit Deep-Copy-Semantik anbietet, sogar über polymorphe Objekte ohne clone()-Funktion hinweg.</p>
<p>Die Verwendung ist äusserst simpel:</p>
<pre><code>aurora::CopiedPtr&lt;Base&gt; a(new Derived);
aurora::CopiedPtr&lt;Base&gt; b = a; // erstellt neues Derived-Objekt
</code></pre>
<p>Ausserdem kann man weitere Cloner- und Deleter-Strategien angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360392</guid><dc:creator><![CDATA[Aurorer]]></dc:creator><pubDate>Tue, 15 Oct 2013 09:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 10:22:00 GMT]]></title><description><![CDATA[<p>Aurorer schrieb:</p>
<blockquote>
<p>Wozu zerbrecht ihr euch den Kopf? Ich habe oben einen Link zu einer Bibliothek gepostet, die eine fertige Implementierung für einen Smart-Pointer mit Deep-Copy-Semantik anbietet, sogar über polymorphe Objekte ohne clone()-Funktion hinweg.</p>
</blockquote>
<p>Die Lib erfordert sehr wohl eine vituelle clone-Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360396</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Oct 2013 10:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 10:33:57 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Die Lib erfordert sehr wohl eine vituelle clone-Funktion.</p>
</blockquote>
<p>Tut sie nicht, du guckst nicht richtig.</p>
<p>@Aurorer<br />
Weil es für manche vielleicht auch interessant ist zu wissen wie bestimmte Dinge funktionieren.<br />
Davon abgesehen ist die Implementierung die du verlinkt hast durchaus verbesserungswürdig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360400</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Oct 2013 10:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 10:44:26 GMT]]></title><description><![CDATA[<p>Aurorer schrieb:</p>
<blockquote>
<p>Deep-Copy-Semantik anbietet, sogar über polymorphe Objekte ohne clone()-Funktion hinweg.</p>
</blockquote>
<p>Ich bin mir gar nicht so sicher, ob das gut ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360402</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 15 Oct 2013 10:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 11:24:10 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a><br />
Was würdest du mit einem kopierenden Zeiger anstellen der das nicht macht? Also der beim Kopieren ein Objekt der Basisklasse erstellt (slicing).<br />
In so einem Fall würde ich gleich den gewünschten Typ direkt verwenden. Oder ggf. <code>boost::optional&lt;T&gt;</code> , wenn ich lazy initialization bzw. allgemein einen &quot;empty&quot; Zustand brauche.</p>
<p>Oder meinst du so ein Zeiger grundsätzlich ist gut, aber er sollte nicht &quot;einfach so&quot; funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360408</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Oct 2013 11:24:10 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 11:27:03 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>nwp3 schrieb:</p>
<blockquote>
<p>Die Lib erfordert sehr wohl eine vituelle clone-Funktion.</p>
</blockquote>
<p>Tut sie nicht, du guckst nicht richtig.</p>
</blockquote>
<p>Ok, ich habe nicht bis zu ende gelesen. Ich mag es trotzdem nicht. Man muss im gesamten Code aufpassen, dass man immer den dynamischen Typ übergibt. Nicht wirklich ein Vorteil gegenüber einer vergessbaren clone-Funktion, wo man nur in den Klassendeklarationen nach einem fehlenden clone suchen muss.<br />
Man warte auf C++2x, dann gibts virtuelle Copy-Konstruktoren und dann funktioniert das out of the box.</p>
<p>(Ich hasse es englisch und deutsch zu mischen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360409</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Oct 2013 11:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 11:59:55 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Man muss im gesamten Code aufpassen, dass man immer den dynamischen Typ übergibt.</p>
</blockquote>
<p>Auch nur dann, wenn man zeitweise mit rohen Zeigern arbeitet, was bei Smartpointern i.d.R. vermeidbar ist. Typischerweise stammen die aus irgendwelchen Factories oder eben einem einfachen make_clone_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360420</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 15 Oct 2013 11:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 12:46:38 GMT]]></title><description><![CDATA[<p>Bzgl Kopieren/Clonen hatte ich das mal ungefähr so gelöst:</p>
<pre><code class="language-cpp">#define AUTO_RETURN(...) -&gt;decltype(__VA_ARGS__) {return __VA_ARGS__;}

namespace clone_details {

struct fallback_on_copy {};
struct prefer_clone : fallback_on_copy {};

template&lt;class T&gt;
auto doit(T const* ptr, fallback_on_copy)
AUTO_RETURN( new T(*ptr) )

template&lt;class T&gt;
auto doit(T const* ptr, prefer_clone)
AUTO_RETURN( ptr-&gt;clone() )

} // clone_details

template&lt;class T&gt;
struct default_clone_destroy
{
    auto clone(T const* ptr)
    AUTO_RETURN(clone_details::doit(ptr,prefer_clone()))

    void destroy(T* ptr)
    { delete ptr; }
};
</code></pre>
<p>(so runtergetippt und nicht getestet)</p>
<p>...so dass man in den meisten Fällen einfach <code>default_clone_destroy</code> zum Klonen und Löschen benutzen kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360430</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 15 Oct 2013 12:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 12:58:24 GMT]]></title><description><![CDATA[<p>Mir faellt noch eine Variante ein, grundlegend saehe das so aus:</p>
<pre><code>#include &lt;type_traits&gt;
#include &lt;utility&gt;

template&lt; typename T &gt;
class clone_ptr_polymorph
{
    void* mDerivedPtr;
    T* mBasicPtr;
    std::pair&lt;T*, void*&gt; (* mCloner)(void*);  

    template&lt; typename Derived &gt;
    static std::pair&lt;T*, void*&gt; clone(void* ptr)
    {
    	auto obj = new Derived{ *reinterpret_cast&lt;Derived*&gt;(ptr) };
    	return { obj, obj };
    }

public:
    template&lt; typename Derived,
              typename=typename std::enable_if&lt;std::is_base_of&lt;T, Derived&gt;::value&gt;::type &gt;
    clone_ptr_polymorph( Derived* ptr ) :
        mDerivedPtr{ptr},
        mBasicPtr{ptr},
        mCloner{ &amp;clone&lt;Derived&gt; } {}

    clone_ptr_polymorph( clone_ptr_polymorph const&amp; p ) :
        mCloner{p.mCloner}
    {
    	auto pair = mCloner(p.mDerivedPtr);
    	mBasicPtr = pair.first;
    	mDerivedPtr = pair.second;
    }

    ~clone_ptr_polymorph()
    {
    	delete mBasicPtr;
    }

    clone_ptr_polymorph( clone_ptr_polymorph&amp;&amp; ) = default;
    clone_ptr_polymorph&amp; operator=( clone_ptr_polymorph&amp;&amp; ) = default;
};

template&lt;typename Base,
         typename Der,
         typename... Args&gt;
clone_ptr_polymorph&lt;Base&gt; make_clone_ptr( Args&amp;&amp;... args )
{
	return { new Der(std::forward&lt;Args&gt;(args)...) };
}

#include &lt;iostream&gt;

struct Base
{
	virtual ~Base() { std::cout &lt;&lt; &quot;Base-Destructor\n&quot;; }
	Base() { std::cout &lt;&lt; &quot;Base-Def-Ctor\n&quot;; }
	Base(Base const&amp;) { std::cout &lt;&lt; &quot;Base-Copy-Ctor\n&quot;; }
	Base(Base&amp;&amp;) { std::cout &lt;&lt; &quot;Base-Move-Ctor\n&quot;; }
};

struct Derived : Base
{
	~Derived() { std::cout &lt;&lt; &quot;Derived-Destructor\n&quot;; }
	Derived() { std::cout &lt;&lt; &quot;Derived-Def-Ctor\n&quot;; }
	Derived(Derived const&amp;) { std::cout &lt;&lt; &quot;Derived-Copy-Ctor\n&quot;; }
	Derived(Derived&amp;&amp;) { std::cout &lt;&lt; &quot;Derived-Move-Ctor\n&quot;; }
};

int main()
{
	auto const&amp; p = make_clone_ptr&lt;Base, Derived&gt;();
	auto second = p;
}
</code></pre>
<p><a href="http://ideone.com/MQ2xTv" rel="nofollow">http://ideone.com/MQ2xTv</a><br />
(Bin gerade nicht konzentriert, da in der Schule, aber so sollte wenigstens hustbaer nicht einen halben Fetzen darin sehen)</p>
<p>Edit: Ich glaube, der Ideone Output ist merkwuerdig... habe ich da boese rumgepfuscht? wieso taucht da<br />
Base-Def-Ctor<br />
Derived-Copy-Ctor<br />
auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360433</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 15 Oct 2013 12:58:24 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:00:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Kann gut sein, was würdest du konkret verbessern?</p>
<p>@nwp3: Man muss den dynamischen Typen nur bei der Initialisierung angeben. In vielen Fällen kennt man ihn dann, weil man das Objekt gerade konstruiert. Und ansonsten nimmt man eben die clone-Strategie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360438</guid><dc:creator><![CDATA[Aurorer]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:07:42 GMT]]></title><description><![CDATA[<p>Ach nein, der (die Ausgabe) ist richtig. Ich habe den copy-ctor ja selbst definiert. :schaem:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360440</guid><dc:creator><![CDATA[Arcoth_logoff]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:17:35 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a><br />
Was würdest du mit einem kopierenden Zeiger anstellen der das nicht macht? Also der beim Kopieren ein Objekt der Basisklasse erstellt (slicing).<br />
In so einem Fall würde ich gleich den gewünschten Typ direkt verwenden. Oder ggf. <code>boost::optional&lt;T&gt;</code> , wenn ich lazy initialization bzw. allgemein einen &quot;empty&quot; Zustand brauche.</p>
<p>Oder meinst du so ein Zeiger grundsätzlich ist gut, aber er sollte nicht &quot;einfach so&quot; funktionieren?</p>
</blockquote>
<p>Ich meinte, daß es evtl gar nicht gut ist, den Benutzer nicht zu zwingen, zu diesem Zwecke clone() selber anzubieten und in die Klassen zu schreiben, hübsch bei den großen 3/5/6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360445</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:32:20 GMT]]></title><description><![CDATA[<p>Der richtige smart pointer hat einen Default-Konstruktor, der automatisch eine Instanz des Programmes das man haben möchte erzeugt. Alles andere ist doch nur Augenwischerei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360449</guid><dc:creator><![CDATA[smarter typ]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:46:12 GMT]]></title><description><![CDATA[<p>smarter typ schrieb:</p>
<blockquote>
<p>Der richtige smart pointer hat einen Default-Konstruktor, der automatisch eine Instanz des Programmes das man haben möchte erzeugt. Alles andere ist doch nur Augenwischerei.</p>
</blockquote>
<p>Aber solch ein Smart-Pointer wäre nur Penisverlängerung... Wer braucht sowas?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360457</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to wahl des richtigen smartpointer on Tue, 15 Oct 2013 13:48:26 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>smarter typ schrieb:</p>
<blockquote>
<p>Der richtige smart pointer hat einen Default-Konstruktor, der automatisch eine Instanz des Programmes das man haben möchte erzeugt. Alles andere ist doch nur Augenwischerei.</p>
</blockquote>
<p>Aber solch ein Smart-Pointer wäre nur Penisverlängerung... Wer braucht sowas?!</p>
</blockquote>
<p>Faule Programmierer mit Freundin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360458</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 15 Oct 2013 13:48:26 GMT</pubDate></item></channel></rss>