<?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[type erasure und std::exception_ptr]]></title><description><![CDATA[<p>Ist euch schonmal aufgefallen dass man <code>std::exception_ptr</code> &quot;schön&quot; als Mittel zur Type-Erasure einsetzen kann -- völlig unabhängig von Exceptions?</p>
<p><code>boost::any</code> und ähnliche Konstrukte haben mMn. eine deutliche Schwäche, und zwar kann man keine Basisklassen-Zeiger/-Referenzen von einem <code>any</code> bekommen. Also wenn man z.B. eine polymorphe Basisklasse <code>printable</code> hat, von der dann mehrere Klassen erben, dann kommt man mit <code>any</code> nicht sehr weit.<br />
Man kann Objekte der abgeleiteten Klassen zwar schön in das <code>any</code> hineintun, aber man kann nicht mehr als <code>printable</code> darauf zugreifen. Man bräuchte den exakten Typ. So lange man immer nur Zugriff auf <em>eine</em> Basisklasse braucht könnte man sich natürlich behelfen indem man einen <code>shared_ptr&lt;Basisklasse&gt;</code> in das <code>any</code> hineintut. Möchte man aber auf 2 oder mehr Basisklassen zugreifen können, oder u.U. sogar ohne es vorher zu wissen checken ob das im <code>any</code> gespeicherte Objekt eine bestimmte Basisklasse hat, dann ... naja, dann wüsste ich zumindest nicht mehr wie man das machen sollte.</p>
<p>Mit C++11 haben wir nun <code>std::exception_ptr</code> bekommen, und damit geht genau das auf einmal:</p>
<p><a href="http://ideone.com/YCMwyS" rel="nofollow">http://ideone.com/YCMwyS</a></p>
<p>Nun ist das ja eine ziemlich greisliche Zweckentfremdung von <code>std::exception_ptr</code> . Die Möglichkeit relativ unkompliziert über Basisklassen auf Objekte in Type-Erasure-Containern ala <code>any</code> zuzugreifen könnte mMn. aber öfters mal nützlich sein.</p>
<p>Und daher frage ich mich: wieso ist kein weniger &quot;brutaler&quot; Weg vorgesehen auf Objekte in einem <code>std::exception_ptr</code> zuzugreifen?</p>
<p>Mir ist schon klar dass keiner von Euch im Standard-Komitte sitzt (bzw. ich gehe davon aus), daher erwarte ich mir auch keine Antwort auf diese Frage. Aber vielleicht findet ja jmd. von Euch das Thema interessant, und hat ein paar Worte dazu zu sagen.</p>
<p>Bzw. auch: würdet ihr diese Funktionalität begrüssen? Für sinnvoll halten? Hattet ihr vielleicht sogar schon Fälle wo ihr euch diese Funktionalität gewünscht hättet?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320065/type-erasure-und-std-exception_ptr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 17:34:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320065.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Sep 2013 03:57:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 04:10:31 GMT]]></title><description><![CDATA[<p>Ist euch schonmal aufgefallen dass man <code>std::exception_ptr</code> &quot;schön&quot; als Mittel zur Type-Erasure einsetzen kann -- völlig unabhängig von Exceptions?</p>
<p><code>boost::any</code> und ähnliche Konstrukte haben mMn. eine deutliche Schwäche, und zwar kann man keine Basisklassen-Zeiger/-Referenzen von einem <code>any</code> bekommen. Also wenn man z.B. eine polymorphe Basisklasse <code>printable</code> hat, von der dann mehrere Klassen erben, dann kommt man mit <code>any</code> nicht sehr weit.<br />
Man kann Objekte der abgeleiteten Klassen zwar schön in das <code>any</code> hineintun, aber man kann nicht mehr als <code>printable</code> darauf zugreifen. Man bräuchte den exakten Typ. So lange man immer nur Zugriff auf <em>eine</em> Basisklasse braucht könnte man sich natürlich behelfen indem man einen <code>shared_ptr&lt;Basisklasse&gt;</code> in das <code>any</code> hineintut. Möchte man aber auf 2 oder mehr Basisklassen zugreifen können, oder u.U. sogar ohne es vorher zu wissen checken ob das im <code>any</code> gespeicherte Objekt eine bestimmte Basisklasse hat, dann ... naja, dann wüsste ich zumindest nicht mehr wie man das machen sollte.</p>
<p>Mit C++11 haben wir nun <code>std::exception_ptr</code> bekommen, und damit geht genau das auf einmal:</p>
<p><a href="http://ideone.com/YCMwyS" rel="nofollow">http://ideone.com/YCMwyS</a></p>
<p>Nun ist das ja eine ziemlich greisliche Zweckentfremdung von <code>std::exception_ptr</code> . Die Möglichkeit relativ unkompliziert über Basisklassen auf Objekte in Type-Erasure-Containern ala <code>any</code> zuzugreifen könnte mMn. aber öfters mal nützlich sein.</p>
<p>Und daher frage ich mich: wieso ist kein weniger &quot;brutaler&quot; Weg vorgesehen auf Objekte in einem <code>std::exception_ptr</code> zuzugreifen?</p>
<p>Mir ist schon klar dass keiner von Euch im Standard-Komitte sitzt (bzw. ich gehe davon aus), daher erwarte ich mir auch keine Antwort auf diese Frage. Aber vielleicht findet ja jmd. von Euch das Thema interessant, und hat ein paar Worte dazu zu sagen.</p>
<p>Bzw. auch: würdet ihr diese Funktionalität begrüssen? Für sinnvoll halten? Hattet ihr vielleicht sogar schon Fälle wo ihr euch diese Funktionalität gewünscht hättet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352651</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 04:10:31 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 09:30:48 GMT]]></title><description><![CDATA[<p>Deine <code>inspect</code> -Funktion ist falsch. (Kein <code>return</code> -Statement)</p>
<p>Vorschlag:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;

class any_ptr
{
    struct WrapperBase
    {
    	virtual ~WrapperBase(){}
    };

    template&lt;typename T&gt;
    struct Wrapper : WrapperBase, T
    {
		template&lt;typename ... Args&gt;
    	Wrapper( Args&amp;&amp;... args ):
    		T( std::forward&lt;Args&gt;(args)... ) {}
    };

    std::unique_ptr&lt;WrapperBase&gt; mPtr;

	any_ptr( std::unique_ptr&lt;WrapperBase&gt; ptr ):
		mPtr{ std::move(ptr) } {}

public:

	template&lt; typename T &gt;
	explicit operator T*()
	{
		return dynamic_cast&lt;T*&gt;(mPtr.get());
	}

	template&lt; typename T &gt;
	explicit operator T const*() const
	{
		return dynamic_cast&lt;T*&gt;(mPtr.get());
	}

	template&lt;typename T&gt;
	friend any_ptr make_any_ptr( T&amp;&amp; t )
	{
		return std::unique_ptr&lt;WrapperBase&gt;{ new Wrapper&lt;T&gt;{ std::forward&lt;T&gt;(t) } };
	}

	template&lt; typename T,
	          typename ... Args &gt;
	friend any_ptr make_any_ptr( Args&amp;&amp;... args )
	{
		return std::unique_ptr&lt;WrapperBase&gt;{ new Wrapper&lt;T&gt;{ std::forward&lt;Args&gt;(args)... } };
	}
};

////////////////////////////////////////////////////////////////////////////////

template &lt;class T&gt;
void inspect(any_ptr&amp; p, void (&amp;fun)(T))
{
	using actual_t = typename std::remove_reference&lt;T&gt;::type;

	if( actual_t* t = static_cast&lt;actual_t*&gt;(p) )
		fun(*t);
}

////////////////////////////////////////////////////////////////////////////////

class printable
{
public:
	virtual void print() const = 0;
};

////////////////////////////////////////////////////////////////////////////////

#include &lt;string&gt;
using namespace std;

class foo : public printable
{
public:
	foo(string const&amp; s) : m_s(s) {}

	virtual void print() const
	{
		cout &lt;&lt; &quot;foo: &quot; &lt;&lt; m_s &lt;&lt; &quot;\n&quot;;
	}

private:
	string m_s;
};

class bar : public printable
{
public:
	bar(int i) : m_i(i) {}

	virtual void print() const
	{
		cout &lt;&lt; &quot;bar: &quot; &lt;&lt; m_i &lt;&lt; &quot;\n&quot;;
	}

private:
	int m_i;
};

////////////////////////////////////////////////////////////////////////////////

void print_printable(printable&amp; p)
{
	p.print();
}

////////////////////////////////////////////////////////////////////////////////

int main()
{
	auto f = make_any_ptr(foo(&quot;foo&quot;));
	auto b = make_any_ptr(bar(42));

	inspect(f, print_printable);
	inspect(b, print_printable);
}
</code></pre>
<p>Funktioniert nicht für skalare Typen, oder finale Klassen. Sonst aber für eine Vererbungshierarchie doch anwendbar?</p>
<p>Ideone: <a href="http://ideone.com/yMrCqb" rel="nofollow">http://ideone.com/yMrCqb</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352663</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 15 Sep 2013 09:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 18:22:26 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Deine <code>inspect</code> -Funktion ist falsch. (Kein <code>return</code> -Statement)</p>
</blockquote>
<p>Naja &quot;kein&quot; ist übertrieben, das <code>return false</code> war schon da, das <code>return true</code> hat halt gefehlt.<br />
Hab's korrigiert.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Funktioniert nicht für skalare Typen, oder finale Klassen. Sonst aber für eine Vererbungshierarchie doch anwendbar?</p>
</blockquote>
<p>Funktioniert auch nicht für Zeiger.<br />
Aber gute Idee, an die Möglichkeit hab' ich nicht gedacht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352785</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 18:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 18:17:07 GMT]]></title><description><![CDATA[<p>Und meine Lösung kommentierst du nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352786</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 15 Sep 2013 18:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 18:39:44 GMT]]></title><description><![CDATA[<p>Ich hab doch schon geschrieben &quot;gute Idee, an die Möglichkeit hab' ich nicht gedacht&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Mit etwas mehr Worten: ja, damit kann man wohl fast alles machen wo man sonst den <code>exception_ptr</code> Hack verwenden wollen würde, und das sogar ganz ohne C++11 (abgesehen von perfect forwarding für die <code>make</code> Funktion und ähnliche Kleinigkeiten).<br />
Die Sache mit den non-class Types kann man ja noch relativ einfach lösen (Spezialisierung), bleiben eigentlich nur noch finale Klassen. Und die Sache dass man keine rohen Zeiger so damit verpacken kann, dass man sie als Zeiger auf ne Basisklasse wieder rausholen kann.<br />
(Also nur den Zeiger, ohne das Objekt.)<br />
Was wohl beides super selten nötig sein wird.</p>
<p>Also wie gesagt: gute Lösung.</p>
<p>Ich könnte jetzt noch suchen ob ich irgend einen Formfehler/Flüchtigkeitsfehler/Unschönheit etc. finde, aber darum geht's ja nicht. Das Konzept sieht für mich OK aus.<br />
Das einzige was mir auf die Schnelle auffällt ist dass du einen <code>dynamic_cast</code> hinter einem <code>static_cast</code> versteckst, was ich nicht so gut finde. Aber wie gesagt, das ist Formsache, und darum geht's ja nicht.</p>
<p>BTW: man könnte das ganze sogar noch weiter reduzieren, indem man gleich <code>shared_ptr&lt;anything&gt;</code> verwendet - wobei <code>anything</code> deinem <code>any_ptr::WrapperBase</code> entspricht. Dann könnte man <code>dynamic_pointer_cast</code> verwenden um an einen permanenten Zeiger mit Ownership auf eine Basisklasse zu kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352789</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 18:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 18:48:39 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich hab doch schon geschrieben &quot;gute Idee, an die Möglichkeit hab' ich nicht gedacht&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Das hast du editiert. <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="🙂"
    /><br />
Guck mal auf die Zeitstempel. Nein, ich wollte tatsächlich nur wissen, ob da nicht noch Fallen versteckt sind die du erkennen könntest.</p>
<p>Tja, man kann Wrapper noch partiell Spezialisieren, sodass es dann auch für Skalare klappt, wie du schon erwähnt hast. Finale Klassen wären für diese Idee tatsächlich so nicht realisierbar.</p>
<blockquote>
<p>Und die Sache dass man keine rohen Zeiger so damit verpacken kann, dass man sie als Zeiger auf ne Basisklasse wieder rausholen kann.</p>
</blockquote>
<p>Hmm, eigentlich ein Einwand... das müsste doch machbar sein...</p>
<blockquote>
<p>Das einzige was mir auf die Schnelle auffällt ist dass du einen dynamic_cast hinter einem static_cast versteckst, was ich nicht so gut finde. Aber wie gesagt, das ist Formsache, und darum geht's ja nicht.</p>
</blockquote>
<p>Der User muss sich im Klaren sein, dass für den Konvertierungsoperator ein paar Takte draufgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352791</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 15 Sep 2013 18:48:39 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:00:56 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich hab doch schon geschrieben &quot;gute Idee, an die Möglichkeit hab' ich nicht gedacht&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Das hast du editiert. <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="🙂"
    /><br />
Guck mal auf die Zeitstempel. Nein, ich wollte tatsächlich nur wissen, ob da nicht noch Fallen versteckt sind die du erkennen könntest.</p>
</blockquote>
<p>Ja, hab editiert. Die Zeit dazwischen war aber so kurz dass ich nicht damit gerechnet habe dass es jmd. dazwischen gelesen hat.</p>
<p>EDIT: Wenn das Forum nicht spinnt, hab ich das doch nicht editiert. Denn der letzte EDIT betraf nur die <code>return</code> Sache, den Absatz hab ich später nochmal editiert. Und es steht da ja &quot;1x editiert&quot;. Oder zählt das Forum EDITs nicht wenn man sie super kurz nach dem posten macht? /EDIT</p>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Und die Sache dass man keine rohen Zeiger so damit verpacken kann, dass man sie als Zeiger auf ne Basisklasse wieder rausholen kann.</p>
</blockquote>
<p>Hmm, eigentlich ein Einwand... das müsste doch machbar sein...</p>
</blockquote>
<p>Ich wüsste nicht wie. Falls es doch geht, immer her damit.<br />
Wenn es ginge, dann wäre damit nämlich auch dir Wrapper-Klasse unnötig.</p>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Das einzige was mir auf die Schnelle auffällt ist dass du einen dynamic_cast hinter einem static_cast versteckst, was ich nicht so gut finde. Aber wie gesagt, das ist Formsache, und darum geht's ja nicht.</p>
</blockquote>
<p>Der User muss sich im Klaren sein, dass für den Konvertierungsoperator ein paar Takte draufgehen.</p>
</blockquote>
<p>Ja, pfuh. Ich würde es halt eher über ne Member-Funktion machen. Oder über ne freie Funktion ala <code>dynamic_pointer_cast</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352794</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:00:09 GMT]]></title><description><![CDATA[<p>Wenn man beim Wrapper Komposition anstatt Vererbung verwendet, geht das auch für finale Klassen.<br />
Und anstatt einem Crosscast von WrapperBase zu T, macht man halt einen downcast zu Wrapper und greift dort auf T zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352797</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:05:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a><br />
Das geht nicht, weil mit Komposition <code>Wrapper&lt;foo&gt;</code> nicht mit <code>Wrapper&lt;printable&gt;</code> verwandt ist (und auch nicht mit <code>foo</code> oder <code>printable</code> ).</p>
<p>Mit Vererbung ist <code>Wrapper&lt;foo&gt;</code> aber mit <code>foo</code> verwandt, und dadurch auch mit <code>printable</code> . Und dadurch kann man casten. Und da <code>WrapperBase</code> ne virtuelle Funktion hat, kann man auch <code>dynamic_cast</code> verwenden. Das ist ja der Trick der die ganze Sache überhaupt möglich macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352798</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:05:31 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:09:30 GMT]]></title><description><![CDATA[<p>Stimmt, der springende Punkt war ja, Vererbungsstrukturen beizubehalten.<br />
Mein Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352799</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:21:04 GMT]]></title><description><![CDATA[<p>Hier die Version mit Skalaren, ich hoffe ich habe nicht zu viel Boilerplate produziert: <a href="http://ideone.com/4E9YZS" rel="nofollow">http://ideone.com/4E9YZS</a></p>
<p>Mache mich jetzt an die Zeiger-Geschichte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352806</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:21:04 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 19:55:51 GMT]]></title><description><![CDATA[<p>Die Erweiterung auf Skalare ist trivial, das hätte ich dir schon geglaubt dass du das hinbekommst. <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="😉"
    /><br />
Interessant - aber vermutlich unmöglich - ist die Geschichte mit den Zeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352811</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 22:03:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Erweiterung auf Skalare ist trivial, das hätte ich dir schon geglaubt dass du das hinbekommst. <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>
</blockquote>
<p>Ich dachte, vielleicht will das ja tatsächlich mal jemand benutzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<blockquote>
<p>vermutlich unmöglich</p>
</blockquote>
<p>Es ist nicht unmöglich. Denn die Idee ist logisch. Solange die Idee richtig ist, kann und muss es auch richtigen Code geben. Irgendwo da draußen ist ein sauberer, völlig standardkonformer und hübscher Code, der nur darauf wartet von mir in der IDE eingetippt zu werden.</p>
<p><strong>Das hier ist eine unportable und hässliche Variante.</strong> Sie ist Implementationsspezifisch und funktioniert wahrscheinlich nicht, laut Standard ist da ebenfalls nichts garantiert (wahrscheinlich UB, könnte man aber sicher auch ohne UB hinbekommen): <a href="http://ideone.com/SShuV3" rel="nofollow">http://ideone.com/SShuV3</a></p>
<p>Schon auf Ideone funktioniert die Variante mit den Skalaren nicht mehr. Obwohl Ideone sogar denselben Compiler verwendet wie ich. Und bei mir klappt es. Daher: Finger weg...<br />
Das funktioniert nur deswegen, weil die Memberfunktion <code>before()</code> bei einigen Compilern die Vererbung berücksichtigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352832</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 15 Sep 2013 22:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Sun, 15 Sep 2013 22:45:38 GMT]]></title><description><![CDATA[<p>Der Code den du da aktuell hast kann nichtmal ansatzweise funktionieren.<br />
Denk an Mehrfachvererbung und virtuelle Vererbung.<br />
Und natürlich braucht man auch definiertes Verhalten für den Fall dass der Zeiger nicht konvertierbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352840</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 22:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 07:58:20 GMT]]></title><description><![CDATA[<p>Was ich dazu weiss: <a href="http://www.cplusplus.com/forum/articles/18756/" rel="nofollow">http://www.cplusplus.com/forum/articles/18756/</a></p>
<blockquote>
<p>Die Möglichkeit relativ unkompliziert über Basisklassen auf Objekte in Type-Erasure-Containern</p>
</blockquote>
<p>Das ist wiederspruechlich: An den Typ/Basistyp von Objekten zu gelangen, deren Typ geloescht ist. Warum sollte ich dann im Vorfeld type erasure anwenden? Auch ist mir unklar, welches Problem geloest werden soll. Nein, &quot;öfters mal nützlich sein&quot; hatte ich noch nie, wobei das kein wirkliches Kriterium ist</p>
<blockquote>
<p>Type-Erasure-Containern</p>
</blockquote>
<p>Was das sind, weiss ich nicht. Container mit type erased objecten? Dann spielen nur type erased objecte 'ne Rolle und der Container ist unwichtig.</p>
<p>Und warum bei Sone neuerdings alles <code>friend</code> sein muss , ist mir auch unklar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352868</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 16 Sep 2013 07:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 08:03:57 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Und warum bei Sone neuerdings alles <code>friend</code> sein muss , ist mir auch unklar.</p>
</blockquote>
<p>Wenn du den Code nicht verstehst, dann verschwende ich nicht meine Zeit damit in dir zu erklären. Soviel sei gesagt: Die Factory braucht Zugriff auf den privaten Konstruktor. Diesen public zu machen, um deinen Ansprüchen genüge zu tun, würde dem User erlauben any_ptr irgendwie zu konstruieren... völliger Blödsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352871</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 16 Sep 2013 08:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 08:07:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn du den Code nicht verstehst, dann verschwende ich nicht meine Zeit damit in dir zu erklären.</p>
</blockquote>
<p>Und du laber mich nicht dumm von der Seite an, auch die friends in deinem Iteratorbeispiel konnten problemlos entfernt weden. Hoehenfluege?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352873</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 16 Sep 2013 08:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 08:29:46 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Wenn du den Code nicht verstehst, dann verschwende ich nicht meine Zeit damit in dir zu erklären.</p>
</blockquote>
<p>Und du laber mich nicht dumm von der Seite an, auch die friends in deinem Iteratorbeispiel konnten problemlos entfernt weden. Hoehenfluege?</p>
</blockquote>
<p>Gut, gut, gut. Tut mir Leid. Erkläre mir bitte, wie man das <code>friend</code> entfernen kann, ohne die Syntax beim Aufruf zu verändern oder die Konstruktoren <code>public</code> zu machen oder sonst irgendwas. <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>Ich sehe keinen Weg. Und <code>friend</code> ist nur ein Schlüsselwort. Solange der User eine Funktion <code>make_any_ptr</code> aufrufen kann, und <code>any_ptr</code>  <code>private</code> Konstruktoren hat, ist doch alles im Lot.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352875</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 16 Sep 2013 08:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 08:57:02 GMT]]></title><description><![CDATA[<p>Kurze Erklaerung: Es gibt gewisse Schluesselreize, die Gefahr bedeuten, beispielsweise ist &quot;new&quot;. Gleiches gilt fuer &quot;friend&quot;. Selbst brauche ich es sehr wenig. Bis jetzt 2 Mal insgesamt. Waehrend fuer &quot;new&quot; direkte Loesungsmoeglichkeiten bestehen, ist &quot;friend&quot; eher ein konzeptionelles Problem. Und bevor ich das angehe, wuerde ich gern wissen, warum man gerne den Typ eines type erased objects haben moechte, bzw. warum man dann in erster Linie ueberhaupt type erasure nutzt. Bei boost::variant erhaelt man das mit 'nem Visitor, ist wohl aber nicht das gesuchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352876</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 16 Sep 2013 08:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 09:47:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
Ein Type Erasure Container ist sowas wie <code>boost::any</code> .</p>
<p>Und die Forderung an den Typ zu kommen ist überhaupt nicht widersprüchlich - das macht man bei Type-Erasure im Prinzip immer. Nur dass es meist hinter spezialisierten privaten Hilfs-Klassentemplates versteckt wird.</p>
<p>Beispiel für wo so etwas nützlich sein könnte wäre eine Registry für Objekte beliebigen Typs. Denk an Dependency Injection Frameworks o.ä. Bzw. auch einfach als Erweiterung von boost::any o.ä.</p>
<p>Was ich nicht verstehe, ist warum bei Fragen wie diesen oft so patzige Antworten kommen. OK, du hast keine Verwendung dafür. Fein. Noted. Kann man aber auch freundlicher sagen.</p>
<p>Das selbe gilt für <code>friend</code> . <code>friend</code> ist ein recht nützlicher Bestandteil von C++, der dabei hilft die Kapselung zu verstärken. Natürlich kann man auch so arbeiten als ob es <code>friend</code> nicht gäbe. Dann wird man <code>friend</code> auch nicht brauchen. Oh Wunder. Was aber nicht heisst dass man dabei unbedingt den besten Code produziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352897</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Sep 2013 09:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 11:29:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ich nicht verstehe, ist warum bei Fragen wie diesen oft so patzige Antworten kommen.</p>
</blockquote>
<p>Zeig sie mir bitte in meinem Eingangspost. Ansonsten: Fuer geegeben Aktion habe ich mich fuer gegeben Reaktion entschieden. An anderen Tagen haette ich mich anders entschieden.</p>
<blockquote>
<p>OK, du hast keine Verwendung dafür. Fein. Noted. Kann man aber auch freundlicher sagen.</p>
</blockquote>
<p>Habe ich dazugeschrieben, dass das kein Kriterium. Kann man freundlich sagen, habe mich aber fuer netral entschieden. Es ist definitive nicht unfreundlich. Und zu friend habe ich mich bereits geaessert.</p>
<blockquote>
<p>Ein Type Erasure Container ist sowas wie boost::any</p>
</blockquote>
<p>Ich dachte boost::any ist einfach nur ein besseres void*.</p>
<blockquote>
<p>Und die Forderung an den Typ zu kommen ist überhaupt nicht widersprüchlich - das macht man bei Type-Erasure im Prinzip immer.</p>
</blockquote>
<p>Und meine Erfahrung widerspricht dem, deswegen habe ich ja von meiner Erfahrung berichtet. Ich verwende Type erasure im klassischen Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352903</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 16 Sep 2013 11:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure und std::exception_ptr on Mon, 16 Sep 2013 21:07:16 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Was ich nicht verstehe, ist warum bei Fragen wie diesen oft so patzige Antworten kommen.</p>
</blockquote>
<p>Zeig sie mir bitte in meinem Eingangspost. Ansonsten: Fuer geegeben Aktion habe ich mich fuer gegeben Reaktion entschieden. An anderen Tagen haette ich mich anders entschieden.</p>
<blockquote>
<p>OK, du hast keine Verwendung dafür. Fein. Noted. Kann man aber auch freundlicher sagen.</p>
</blockquote>
<p>Habe ich dazugeschrieben, dass das kein Kriterium. Kann man freundlich sagen, habe mich aber fuer netral entschieden. Es ist definitive nicht unfreundlich.</p>
</blockquote>
<p>Hab deinen (an mich gerichteten) Beitrag nochmal gelesen. Du hast Recht. Sorry. Deine Korrespondenz mit Sone hat da beim ersten mal Lesen auf meine Erinnerung an deinen ersten Beitrag hier abgefärbt.</p>
<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Ein Type Erasure Container ist sowas wie boost::any</p>
</blockquote>
<p>Ich dachte boost::any ist einfach nur ein besseres void*.</p>
</blockquote>
<p>Ja, pfuh. Ich weiss nicht ob Type Erasure Container ein viel verwendeter Ausdruck ist. Aber irgendwie muss man es ja nennen. Ich nenne es halt Type Erasure Container. Wie würdest du es nennen (ausser &quot;besseres void*&quot;)?</p>
<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Und die Forderung an den Typ zu kommen ist überhaupt nicht widersprüchlich - das macht man bei Type-Erasure im Prinzip immer.</p>
</blockquote>
<p>Und meine Erfahrung widerspricht dem, deswegen habe ich ja von meiner Erfahrung berichtet. Ich verwende Type erasure im klassischen Sinn.</p>
</blockquote>
<p>Also ich hätte mir schon hin und wieder mal die Möglichkeit gewünscht aus nem <code>any</code> &quot;Interface-Zeiger&quot; bekommen zu können.<br />
Oder noch besser: gleich nen <code>dynamic_cast</code> ausgehend von <code>void*</code> machen zu können.<br />
Mir ist klar dass das nicht dem &quot;C++ way of doing things&quot; entspricht. Nur manchmal passt der &quot;C++ way of doing things&quot; nicht so gut, und der &quot;C# way of doing things&quot; wäre viel angenehmer für einen bestimmten Programmteil. Da nervt dann der quasi nicht-vorhandene Reflection-Support von C++ etwas.</p>
<p>Ich bei solchen Dingen kein Tagebuch, und da ich auch kein idetisches Gedächtnis habe, und ich mir solche Dinge zugegebenermassen nicht jeden Tag wünsche, kann ich auch kein konkretes Beispiel liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2353077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2353077</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Sep 2013 21:07:16 GMT</pubDate></item></channel></rss>