<?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[shared_ptr casten]]></title><description><![CDATA[<p>Hallo,<br />
ich gehe davon aus, dass es nicht geht, aber bevor ich die Konsequenzen davon umsetze, folgende Frage:</p>
<p>Gegeben ein shared_ptr&lt;T&gt; und eine externe Möglichkeit T* zu S* casten - gibt es einen Weg einen shared_ptr&lt;S&gt; zu erzeugen, der den Refcount des shared_ptr&lt;T&gt; weiterbenutzt? Mir fielen jetzt nur Lösungen mit custom deletern auf beiden Seiten ein, aber das ist keine Lösung, die ich in Betracht ziehen möchte.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320887/shared_ptr-casten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 14:06:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320887.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Oct 2013 06:07:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 06:07:09 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich gehe davon aus, dass es nicht geht, aber bevor ich die Konsequenzen davon umsetze, folgende Frage:</p>
<p>Gegeben ein shared_ptr&lt;T&gt; und eine externe Möglichkeit T* zu S* casten - gibt es einen Weg einen shared_ptr&lt;S&gt; zu erzeugen, der den Refcount des shared_ptr&lt;T&gt; weiterbenutzt? Mir fielen jetzt nur Lösungen mit custom deletern auf beiden Seiten ein, aber das ist keine Lösung, die ich in Betracht ziehen möchte.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360608</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 06:07:09 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 07:56:40 GMT]]></title><description><![CDATA[<p>Suchst du <code>dynamic_pointer_cast</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360622</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 16 Oct 2013 07:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 08:10:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Gegeben ein shared_ptr&lt;T&gt; und eine externe Möglichkeit T* zu S* casten</p>
</blockquote>
<p>Meinst du damit einfach irgendeine freie Funktion, die einen Zeiger T* nimmt und S* zurückgibt?</p>
<p>Edit²: Ich ziehe mal alles zurück und warte erst auf die Antwort auf obige Frage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360625</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 16 Oct 2013 08:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 08:47:56 GMT]]></title><description><![CDATA[<p>Nee, leider nicht,<br />
die Situation ist, dass ich auf keiner Seite die Information zu beiden Typen zur Compile-Zeit habe. Ich kann wissen, dass auf der anderen Seite irgendein shared_ptr steht, und ich auf dieser Seite einen haben möchte, vielleicht mit anderem Typ. Ich habe zudem Maschinerie (In Form eines cast-graphs), die den Cast für den angezeigten Typ umsetzen kann oder aber auch nicht. Stellt euch das so vor, dass ich das zwischendurch durch ein void* pressen muss. Aber die casts, die stattfinden, sind bei Benutzung im spezifizierten Rahmen &quot;sicher&quot;.<br />
Wenn das nicht geht, muss ich dieselbe Maschinerie benutzen, um shared_ptr&lt;T&gt;'s ineinander zu konvertieren (plus Benutzung von boost::any oder einem äquivalent, weil dann ja zwischendurch echte Wert-Typen benötigt werden), wenn es ginge, bräuchte ich nichts zusätzliches zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360636</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 08:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 09:27:18 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht ganz, warum du nicht dynamic_pointer_cast oder static_pointer_cast benutzen kannst.</p>
<p>Aber so würde es auch gehen:</p>
<pre><code class="language-cpp">U* convert_somehow(T*);

int main() {
  shared_ptr&lt;T&gt; p1 = ...;
  shared_ptr&lt;U&gt; p2 (p1,convert_somehow(p1.get()));
}
</code></pre>
<p>Hier teilen sich p1 und p2 denselben Deleter und dieselben Referenzzähler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360649</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 16 Oct 2013 09:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 11:16:06 GMT]]></title><description><![CDATA[<p>Ganz genau erklärt (mit den Konsequenzen, die ich aber schon beschrieb):<br />
Ich habe sozusage Type-Erased Typen hier und das bezieht sich wiedermal auf meine luabind-Anpassungen.<br />
Ich habe einen opaken Typ, den ich darum bitten kann, einen Wert mit als void* verkappten Typ mit gewisser ID (ein integer-Wert, der bei Programmstart erzeugt wird) zurückzuliefern. Hinter der Fassade wird das mit einem Netzwerk von Casts gemacht, die zur Compile-Zeit generiert werden. Das dient dazu, dass man alle Klassen, die registriert werden und zu denen man die Beziehungen angibt, ineinander konvertieren kann (ausschließlich wenn Zeiger und Referenzen verlangt werden, Slicing möchte ich nicht noch unterstützen), ohne dass eine kombinatorische Explosion zu befürchten ist.<br />
Nun wird zur Laufzeit eine C++-Funktion aufgerufen und während die Signatur mit den Parametern gematcht wird, versucht der Matcher das opake Argument anzuweisen, einen Zeiger vom gewünschten Typ zu liefern.<br />
Für smart pointer existiert spezieller Code, der den smart pointer bei der Betrachtung sozusagen &quot;überspringt&quot; und direkt mit den von den Zeigern angezeigten Objekten arbeitet. Ich kann also einen Zeiger auf ein implizit gecastetes Objekt erhalten und weiß, dass dieses Objekt durch einen smart-pointer gehalten wird, aber ich habe keine Möglichkeit einen neuen smart-pointer zusammenzusetzen, weil ich dafür wahrscheinlich explizit die Implementierungs-Interna verwenden müsste (also den Deleter und den Count-Holder mit rüberreichen, von denen ich ausgehe, dass sie an oberster Ebene nicht vom Typ des Zeigers abhängen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360689</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 11:16:06 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 11:19:07 GMT]]></title><description><![CDATA[<p>Und meine Fallback-Lösung ist jetzt, für smart pointer ebenfalls casts im Cast-Graph zu hinterlegen. Da müsste dann der Benutzer gegenenenfalls etwas mithelfen und ansagen, ob und mit welchen smart-pointern so hantiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360690</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 11:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 11:19:36 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig verstanden habe, verliert er irgendwann die Information, dass das Objekt bereits in einen <code>shared_ptr</code> verpackt ist.</p>
<p>Darfst/kannst du <code>T</code> anfassen? Du kannst <code>T</code> von <code>enable_shared_from_this</code> erben lassen und den Reference Counter nach <code>T</code> verschieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360691</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 16 Oct 2013 11:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 11:23:28 GMT]]></title><description><![CDATA[<p>Halllo Doc,<br />
ich möchte nicht vorschreiben, dass man davon ableitet, aber danke dass Du's erwähnst, da hatte ich noch gar nicht dran gedacht, einen Spezialcase dafür, wenn das möglich ist, werde ich auf jeden Fall vorsehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360692</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 11:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 11:26:20 GMT]]></title><description><![CDATA[<p>Und die Information, dass ein shared_pointer auf der anderen Seite ist, habe ich schon, aber ich habe zur Compile-Zeit nicht die Typ-Information von beiden Seiten, sodass ich &quot;einfach&quot; static_pointer_cast oder dynamic_pointer_cast verwenden könnte (von lua aus kann man ja mit allen möglichen Argumenten die Funktion aufrufen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360694</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 11:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 16:59:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/34233">@decimad</a><br />
krümelkacker hat dir doch schon ne Lösung geschrieben. Wo ist denn bei der das Problem?</p>
<p>Anstatt das (undokumentierte) Counter-Objekt abzuspeichern kannst du dann einfach nen <code>shared_ptr&lt;void&gt;</code> abspeichern. (Oder sogar nen <code>weak_ptr&lt;void&gt;</code> ).<br />
Aus diesem plus einem <code>T*</code> kannst du dir dann jederzeit wieder nen <code>shared_ptr&lt;T&gt;</code> basteln der das selbe Counter-Objekt (inklusive Deleter) verwendet wie der &quot;originale&quot; <code>shared_ptr</code> .</p>
<p>Das kann man z.B. auch dazu verwenden <code>shared_ptr</code> auf Member von Objekten zu erzeugen. Also quasi sowas:</p>
<pre><code class="language-cpp">shared_ptr&lt;MyStruct&gt; p = ...;
shared_ptr&lt;int&gt; p2(p, &amp;(p-&gt;myIntMember)); // Zeigt auf das &quot;myIntMember&quot; in *p und hält gleichzeitig *p am Leben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2360755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360755</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 16 Oct 2013 16:59:26 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 17:54:19 GMT]]></title><description><![CDATA[<p>Moah, mea culpa, da hätte ich besser recherchieren müssen, krümel's Vorschlag habe ich einfach missverstanden. Praktisch genau das habe ich ja gesucht von Anfang an, ich wollte ja den share counter wiederverwenden und etwas anderes reintun <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="😃"
    /> Moah... Es tut mir Leid eure Zeit vergeudet zu haben mit ellenlangem Text, ich hatte nie im Traum gewagt zu glauben, dass die shared_ptr-Entwickler an so einen Spezialfall gedacht haben... Da brauche ich nur für die unterstützten smart-pointer per traits einen Repräsentanten zu definieren (eben std::shared_ptr&lt;void&gt; und habe auch einen spezifischen Typ, nach dem ich Fragen kann. Genialst! Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360770</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Wed, 16 Oct 2013 17:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr casten on Wed, 16 Oct 2013 19:19:44 GMT]]></title><description><![CDATA[<p>Hehe.</p>
<p>&gt; krümel's Vorschlag habe ich einfach missverstanden<br />
Das (oder dass du den Beitrag übersehen hast) hab' ich fast schon vermutet, daher hab' ich nochmal nachgefragt.</p>
<p>Es ist eben kein so spezieller Spezialfall, und daher wird das auch unterstützt. Gerade die &quot;inner Pointer&quot; (also Zeiger auf ein Member) braucht man öfters. Bzw. wenn man &quot;Casts&quot; Marke Eigenbau wie z.B. <code>IUnknown::QueryInterface</code> verwenden will braucht man es auch. Und das kommt durchaus nicht SO selten vor.</p>
<p>ps: Hier der passende &quot;cppreference&quot; Link:</p>
<p><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr" rel="nofollow">http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr</a></p>
<blockquote>
<ol start="8">
<li>Constructs a shared_ptr which shares ownership information with r, but holds an unrelated and unmanaged<br />
pointer ptr. Even if this shared_ptr is the last of the group to go out of scope, it will call the destructor for the object originally managed by r. However, calling get() on this will always return a copy of ptr. It is the responsibility of the programmer to make sure that this ptr remains valid as long as this shared_ptr exists, such as in the typical use cases where ptr is a member of the object managed by r or is an alias (e.g., downcast) of r.get()</li>
</ol>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2360781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360781</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 16 Oct 2013 19:19:44 GMT</pubDate></item></channel></rss>