<?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[Typenvariable Argumente, aber Boost.Any schlechter Stil?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mich mal etwas mit boost beschäftigen und habe somit eine IRC-Lib angefangen, welche auf Boost.Asio zurückgreift.<br />
Um einen EventManager zu realisieren, wollte ich eine Event-Klasse schreiben, welche jeweils einen Namen und beliebig viele, indexierte (std::vector) Argumente hat, welche natürlich jeweils verschiedene Typen aufweisen können (z. B. Channel, User, Mode, std::string, int, ...).<br />
Da dachte ich dann an Boost.Any. Natürlich ist auch Boost.Any kein Wunderwerk und erstellt intern natürlich Kopien, was für meine Belange gar nicht so gut ist... oder denke ich falsch? Und mit Pointern wollte ich eigentlich nicht umwerfen.</p>
<p>Hier ist die Event-Klasse: <a href="http://42.holz.nu/6e793.png" rel="nofollow">http://42.holz.nu/6e793.png</a></p>
<p>Ist das schlechtes Design?<br />
Wie würdet ihr das machen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312750/typenvariable-argumente-aber-boost-any-schlechter-stil</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 18:35:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312750.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Jan 2013 10:36:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 10:37:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mich mal etwas mit boost beschäftigen und habe somit eine IRC-Lib angefangen, welche auf Boost.Asio zurückgreift.<br />
Um einen EventManager zu realisieren, wollte ich eine Event-Klasse schreiben, welche jeweils einen Namen und beliebig viele, indexierte (std::vector) Argumente hat, welche natürlich jeweils verschiedene Typen aufweisen können (z. B. Channel, User, Mode, std::string, int, ...).<br />
Da dachte ich dann an Boost.Any. Natürlich ist auch Boost.Any kein Wunderwerk und erstellt intern natürlich Kopien, was für meine Belange gar nicht so gut ist... oder denke ich falsch? Und mit Pointern wollte ich eigentlich nicht umwerfen.</p>
<p>Hier ist die Event-Klasse: <a href="http://42.holz.nu/6e793.png" rel="nofollow">http://42.holz.nu/6e793.png</a></p>
<p>Ist das schlechtes Design?<br />
Wie würdet ihr das machen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289224</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 10:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 10:45:31 GMT]]></title><description><![CDATA[<p>Wenn dann im Programm doch nur 6 verschiedene Events geworfen werden, warum nicht 6 Eventklassen?</p>
<pre><code>log&lt;&lt;&quot;User &quot;&lt;&lt;ev.params[7].get&lt;User&gt;().name()&lt;&lt;&quot; hat den Channel &quot;&lt;&lt;ev.params[3].get&lt;Channel&gt;().name()&lt;&lt; &quot;betreten.\n&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2289225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289225</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Jan 2013 10:45:31 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 10:45:10 GMT]]></title><description><![CDATA[<p>Weil ich Custom-Events erlauben will.<br />
Die Library soll durch Module erweiterbar sein, d. h. Modul 1 soll bspw. das Event &quot;Bla&quot; feuern können, und alle anderen sollten es empfangen können.<br />
Das geht mit vordefinierten Klassen nicht so gut / gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289227</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 10:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 10:47:09 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Weil ich Custom-Events erlauben will.<br />
Die Library soll durch Module erweiterbar sein, d. h. Modul 1 soll bspw. das Event &quot;Bla&quot; feuern können, und alle anderen sollten es empfangen können.<br />
Das geht mit vordefinierten Klassen nicht so gut / gar nicht.</p>
</blockquote>
<p>Können alle anderen die Events denn überhaupt verarbeiten?<br />
Würde es reichen, eine gemeinsame Basisklasse zu haben?</p>
<p>Wenns denn unbedingt sein muß, würde ich an variadic templates denken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289229</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Jan 2013 10:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 10:50:04 GMT]]></title><description><![CDATA[<p>VS2012 kann leider keine Variadic Templates.<br />
Ja, können sie.<br />
Beispielsweise kennt das IRC von Haus aus kein UserAuthed-Event. Für das Quakenet würde ich dann ein Module schreiben, welche das feuert, damit andere das benutzen können.</p>
<p>Wie soll das mit Templates funktionieren? Und auch, wie das aus deinem ersten Post (das, was du reineditierst hast) funktionieren soll, verstehe ich nicht? Dann würden ja jedes mal Kopien eines Users erstellt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289230</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 10:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:03:12 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>VS2012 kann leider keine Variadic Templates.<br />
Ja, können sie.<br />
Beispielsweise kennt das IRC von Haus aus kein UserAuthed-Event. Für das Quakenet würde ich dann ein Module schreiben, welche das feuert, damit andere das benutzen können.</p>
</blockquote>
<p>Ja, und wer ein UserAuthed-Event benutzen will, muss aber schon die selbe &quot;UserAuthedEvent.hpp&quot; inkludieren. Und alle Events erben von Event.<br />
Kann mir nicht vorstellen, daß irgend ein Event-Empfänger (außer dem Logger) ein Event empfangen möchte und verarbeiten kann, von dem er nicht vorher die Struktur kennt.</p>
<pre><code>registerEventHaqndler(&quot;UserAuthedEvent&quot;,this);
...
void processEvent(Event* e){
   UserAuthedEvent uae=static_cast&lt;UserAuthedEvent*&gt;(e);//dynamic_cas ist völlig überbewertet, löl. 
   //tuwas
}
</code></pre>
<p>Passen die signals von boost?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289232</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:07:58 GMT]]></title><description><![CDATA[<p>Okay, überzeugt. Für diesen Fall ausreichend.<br />
Aber wie würdest du es machen, wenn ein Pluginsystem hinzukommt, welches Module per dynamischer Bibliothek nachlädt? <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/2289234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289234</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:07:58 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:12:44 GMT]]></title><description><![CDATA[<p>Verstehe nicht, inwiefern Plugins da das Geschäft erschweren, wenn immer Basisklassenzeiger herumgereicht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289235</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:17:07 GMT]]></title><description><![CDATA[<p>Okay...<br />
Kann ich für den Fall eigentlich auch Boost.Bind benutzen?<br />
Das würde mich mal interessieren, beispielsweise dass so etwas möglich ist:</p>
<pre><code class="language-cpp">class Bla
{
public:
    void OnUserAuthed(UserAuthedEvent *e)
    {
    }
};

// ...

Bla b;
EventManager x;

x.RegisterListener(&quot;UserAuthed&quot;, boost::bind(&amp;Bla::OnUserAuthed, &amp;b, _1));
</code></pre>
<p>Würde so etwas gehen? Wenn ja, wie muss die Signatur von EventManager::RegisterListener() aussehen?<br />
Vielen Dank <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/2289236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289236</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:22:11 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>wie muss die Signatur von EventManager::RegisterListener() aussehen?<br />
Vielen Dank <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>Wenn der Aufruf steht, kannste den Compiler fragen. Einfach eine Funnktion mit falscher Signatur anbieten und compilieren und die richtige Signatur in der Fehlermeldung lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289237</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 11:41:06 GMT]]></title><description><![CDATA[<p>Das geht so aber nicht, weil die std::function einen festen Call-Typ erwartet, daher kannst du kein Event-Spezifischen Typ als Parameter verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289243</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 13 Jan 2013 11:41:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 12:09:41 GMT]]></title><description><![CDATA[<p>Schade. Also doch Pointer-Casting. Oder kann Boost.Function das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289247</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sun, 13 Jan 2013 12:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Sun, 13 Jan 2013 14:45:35 GMT]]></title><description><![CDATA[<p>Du kannst dir eine &quot;Trampolin&quot;-Funktion schreiben, die zwischen <code>std::function</code> (wozu Boost?) und deinem <code>OnUserAuthed()</code> liegt. Sie führt einen Downcast durch und gibt den Zeiger an <code>OnUserAuthed()</code> weiter.</p>
<p>Dabei musst du natürlich Typsicherheit garantieren, sonst wird das mit dem Downcast nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289278</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Jan 2013 14:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 06:04:12 GMT]]></title><description><![CDATA[<p>Wenn ich dich richtig verstanden habe, ist das Problem, dass du zur Compilezeit noch nicht weisst, welche Nachrichten kommen, und du in Zukunft ohne das das Hauptprogramm neu compiliert wird weitere Nachrichten hinzukommen?</p>
<p>Falls ja, das exakt selbe Problem habe ich gelöst, indem ich die Nachrichten als XML-Text verschickt habe.</p>
<p>Jeder kann sich als Nachrichten-Empfänger anhängen (via boost::signals). Wer was mit der Nachricht anfangen kann, bearbeitet sie, und schickt die Antwort ebenfalls per XML.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289428</guid><dc:creator><![CDATA[BadWolf]]></dc:creator><pubDate>Mon, 14 Jan 2013 06:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 06:24:14 GMT]]></title><description><![CDATA[<p>BadWolf schrieb:</p>
<blockquote>
<p>Wenn ich dich richtig verstanden habe, ist das Problem, dass du zur Compilezeit noch nicht weisst, welche Nachrichten kommen, und du in Zukunft ohne das das Hauptprogramm neu compiliert wird weitere Nachrichten hinzukommen?</p>
<p>Falls ja, das exakt selbe Problem habe ich gelöst, indem ich die Nachrichten als XML-Text verschickt habe.</p>
<p>Jeder kann sich als Nachrichten-Empfänger anhängen (via boost::signals). Wer was mit der Nachricht anfangen kann, bearbeitet sie, und schickt die Antwort ebenfalls per XML.</p>
</blockquote>
<p>Optimalerweise gibt es für die Nachrichten auch Dokumenttypdefinitionen. Außer bei so platten Sachen wie &quot;Anzeigen der Nachricht&quot; braucht der Empfänger ja eine Wissen darüber, was er zu erwarten hat.<br />
Also teilen sich Sender und Empfänger eine DTD zu dieser XML-Nachricht. Das Kernsystem muß davon überhaupt keine Ahnung haben, nicht die Geringte. Es sieht nur XML, ohne reinzugucken. Es können zwei Plugins trotzdem Nachrichten austauschen, sie sind sich eben zur Compilezeit über das Format einig.</p>
<p>Na, mal hoffen, daß das nicht nach inner platform effect riecht.</p>
<p>Headerfile statt DTD und Basisklassenzeiger statt XML und man hats als Sprachmittel. Ich verstehe Eure Motivation nicht. Odert redest Du gerade bloß davon, Nachrichten zu serialisieren, damit man sie übers Netz schicken kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289431</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 14 Jan 2013 06:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 08:38:58 GMT]]></title><description><![CDATA[<p>Der einzige Unterschied besteht darin, dass es nicht zwingend abstürzt, wenn man sich doch nicht an die DTD hält, oder? Da wäre doch dynamic_cast auch nicht schlechter und würde keine Multi-Millionen-Zeilen XML-Bibliothek und einen DTD-Server benötigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289453</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 Jan 2013 08:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 08:42:21 GMT]]></title><description><![CDATA[<p>Okay, dynamic_cast verlangt natürlich nach einem kompatiblen Compiler... Dann halt eine normale struct mit GUID-Message Ids und reinterpret_cast...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289454</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 Jan 2013 08:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 08:47:34 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Okay, dynamic_cast verlangt natürlich nach einem kompatiblen Compiler... Dann halt eine normale struct mit GUID-Message Ids und reinterpret_cast...</p>
</blockquote>
<p>static_cast</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289457</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 14 Jan 2013 08:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 09:32:06 GMT]]></title><description><![CDATA[<p>Okay, ich muss das jetzt ein für alle mal lernen. Macht es denn bei so einer Form von Downcast einen Unterschied, ob ich reinterpret_cast oder static_cast verwende? Kann die abgelittene Klasse irgendeine Form von Alignment verändern, dass reintepret_cast falsch ist? Okay, static_cast kann anspringen wenn es sieht, dass die Klasse gar nicht in Verbindung stehen. Aber kann es auch zur Laufzeit was verändern? Ich meine die Nachricht kann ja in keinem für diese Nachrichten spezifischen Adressraum sein, oder durch einen Cast dazwischen wandern.</p>
<p>Danke schonmal für Aufklärung.</p>
<p>Edit: Hrmmm, mehrfach-Vererbung vielleicht? Die konkrete Nachricht leitet von der Basisnachricht und etwas anderem ab, eventuell in anderer Reihenfolge, sodass die Basisnachricht nicht &quot;vorne&quot; im Speicher liegt?<br />
Edit2: Herrje, wie funktioniert in solch einem Fall eigentlich das delete? Okay, die Zerstörung geht dank virtuellem Destruktor ja problemlos, aber wie bekommt delete die Richtige Basisadresse raus? Gibt's da eine versteckte virtuelle Funktion, die die Basisadresse der konkreten Klasse ausspuckt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289465</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 Jan 2013 09:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 11:21:48 GMT]]></title><description><![CDATA[<p>reinterpret_cast garantiert nur, daß wenn man einen zeiger in einen beliebigen typen und wieder zurück castst, wieder das original erhält (platz muss natürlich genug da sein). über die gültigkeit des zwischenergebnisses habe ich keine ahnung, fürchte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289497</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 14 Jan 2013 11:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 12:17:38 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Macht es denn bei so einer Form von Downcast einen Unterschied, ob ich reinterpret_cast oder static_cast verwende?</p>
</blockquote>
<p>Ich weiß jetzt nicht genau, was für einen Cast du meinst. Aber wenn du dich innerhalb einer Vererbungshierarchie bewegst, solltest du entweder dynamic_cast oder static_cast verwenden. Bei reinterpret_cast findet ein ggf notwendiges Adjustment nicht statt. Das knallt dir dann spätestens bei Mehrfachvererbung um die Ohren, siehe <a href="http://codepad.org/LgZ7Ubxr" rel="nofollow">hier</a>.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

struct A {int i;};
struct B {int j;};
struct C : A, B {};

int main()
{
  C c;
  B&amp; b = c;
  C&amp; c2 = static_cast&lt;C&amp;&gt;(b);
  C&amp; c3 = reinterpret_cast&lt;C&amp;&gt;(b);
  cout &lt;&lt; &amp;c &lt;&lt; endl;
  cout &lt;&lt; &amp;b &lt;&lt; endl;
  cout &lt;&lt; &amp;c2 &lt;&lt; endl;
  cout &lt;&lt; &amp;c3 &lt;&lt; endl;
}
</code></pre>
<p>Bei meinem <a href="http://codepad.org/LgZ7Ubxr" rel="nofollow">Test</a> sieht man, dass die Adressen &amp;c und &amp;b unterschiedlich sind. Der static_cast für c2 ist quasi die Umkehrung dieser impliziten Wandlung und stellt die richtige Adresse wieder her. Der reinterpret_cast führt hier dazu, dass c3 keine gültige Referenz auf ein C-Objekt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289515</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jan 2013 12:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Mon, 14 Jan 2013 12:39:30 GMT]]></title><description><![CDATA[<p>Okay, danke Dir für die ausführliche Erklärung!<br />
Ich find Mehrfachvererbung sowieso blöd, das führt immer zu Streitereien! <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>Hast Du auch eine Ahnung wie das mit dem Löschen bei Mehrfachvererbung läuft, wie ich im zweiten Edit fragte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289520</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 Jan 2013 12:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Typenvariable Argumente, aber Boost.Any schlechter Stil? on Tue, 15 Jan 2013 01:23:39 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Edit2: Herrje, wie funktioniert in solch einem Fall eigentlich das delete? Okay, die Zerstörung geht dank virtuellem Destruktor ja problemlos, aber wie bekommt delete die Richtige Basisadresse raus? Gibt's da eine versteckte virtuelle Funktion, die die Basisadresse der konkreten Klasse ausspuckt?</p>
</blockquote>
<p>Naja, dass es für die Implementierung kein Problem sein kann/darf, die &quot;Basisadresse&quot; zu ermitteln, sollte ja wohl klar sein.</p>
<p>Der VTable-Zeiger eines z.B. Foo-Teilobjekts das Teil eines Bars ist zeigt (bei Mehrfachverrebung) ja nicht auf den Foo-VTable oder Bar-VTable, sondern auf einen speziellen Foo-in-Bar-VTable.<br />
Da der VTable nicht nur die Adressen von virtuellen Funktionen enthält, sondern auch einen Zeiger auf Informationen über das Layout des konkreten Objekts, kann man da einiges machen.<br />
Ist auch nötig, sonst könnte <code>dynamic_cast</code> nicht implementiert werden.</p>
<p>Und um deine konkrete Frage auch noch zu beantworten: ja, es gibt so eine Funktion, und zwar <code>dynamic_cast&lt;void*&gt;(p)</code> (wobei das nicht unbedingt eine versteckte virtuelle Funktion ist, aber es werden sicher Informationen aus dem VTable oder darin verlinkten Datenstrukturen verwendet). Das liefert die Adresse des &quot;most derived object&quot; -- also die Anfangsadresse des konkreten Objekts.<br />
Das wird auch die Adresse sein die üblicherweise an <code>operator delete</code> übergeben wird. Bzw. ich meine sogar dass es immer die Adresse sein muss die an <code>operator delete</code> übergeben wird, ich glaube nicht dass der Standard hier genug Spielraum lässt es anders zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289731</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Jan 2013 01:23:39 GMT</pubDate></item></channel></rss>