<?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[ausdruck durch konstanten ausdruck ersetzbar?]]></title><description><![CDATA[<p>für zwei beliebige klassen T und U, wobei U direkt oder mittelbar abgeleitet ist (aber nicht virtuell), ist für einen pointer u auf ein beliebiges (unter-)objekt vom typ U:</p>
<pre><code class="language-cpp">T* t = p;
prtdiff_t diff = reinterpret_cast&lt; char* &gt;( u ) - reinterpret_cast&lt; char* &gt;( t );
</code></pre>
<p>diff eine konstante, die der compiler kennt (andernfalls wäre static_cast in downcasts grundsätzlich unsicher). gibt es eine möglichkeit, diff as konstanten ausdruck zu erhalten (ich hatte an offsetof gedacht, aber die basis klasse ist ja kein echter member)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/127464/ausdruck-durch-konstanten-ausdruck-ersetzbar</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 03:18:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/127464.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Nov 2005 14:36:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 14:36:37 GMT]]></title><description><![CDATA[<p>für zwei beliebige klassen T und U, wobei U direkt oder mittelbar abgeleitet ist (aber nicht virtuell), ist für einen pointer u auf ein beliebiges (unter-)objekt vom typ U:</p>
<pre><code class="language-cpp">T* t = p;
prtdiff_t diff = reinterpret_cast&lt; char* &gt;( u ) - reinterpret_cast&lt; char* &gt;( t );
</code></pre>
<p>diff eine konstante, die der compiler kennt (andernfalls wäre static_cast in downcasts grundsätzlich unsicher). gibt es eine möglichkeit, diff as konstanten ausdruck zu erhalten (ich hatte an offsetof gedacht, aber die basis klasse ist ja kein echter member)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926138</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 24 Nov 2005 14:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 14:40:45 GMT]]></title><description><![CDATA[<p>Das geht nicht!<br />
Es sei denn T und U sind Normalteiler<br />
bzw. polymorph zueinander!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926142</guid><dc:creator><![CDATA[sigridweyl]]></dc:creator><pubDate>Thu, 24 Nov 2005 14:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 14:48:11 GMT]]></title><description><![CDATA[<p>Das klingt ziemlich brutal und ich frage mich, was du damit vor hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Rein theoretisch sollte der Ausdruck aber schon zur Compilezeit konstant sein für zwei vollständig benannte Klassen T und U. Wie man diesen aber legal bekommt, geschweige denn legal verwendet, wüsste ich aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926148</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Thu, 24 Nov 2005 14:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 15:33:07 GMT]]></title><description><![CDATA[<p>sigridweyl schrieb:</p>
<blockquote>
<p>Das geht nicht!<br />
Es sei denn T und U sind Normalteiler<br />
bzw. polymorph zueinander!</p>
</blockquote>
<p>ich sagte bereits, dass U direkt oder mittelbar von T abgeleitet sein soll. T und U müssen keineswegs polymorph sein, damit eine wandlung von U* nach T* legal ist (auch wenn das in dem code, um den es mir geht, eine voraussetzung ist).</p>
<p>und ja es ist brutal, es geht hier auch um die (möglicherweise ganz evtl <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="🙂"
    /> mögliche) optimierung eines templates, genauer den auto_ptr, den ich hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-127044.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-127044.html</a><br />
gebastelt habe. in diesem falle ist auto_ptr_ref zwar sicher aber auch im allgemeinen sehr ineffizient. das kann man für zumindest für den fall, dass keine konvertierung stattfindet, optimieren (die signatur ist dann nicht mehr ganz standard-konform, an der nutzbarkeit des templates ändert sich aber nichts):</p>
<pre><code class="language-cpp">template&lt;typename Target, bool same_type = false&gt;
	class auto_ptr_ref
	{
		template&lt;typename&gt;
		friend class auto_ptr;
		explicit auto_ptr_ref(void** pptr, Target* ptr) throw()
			: pptr_( pptr ), ptr_( ptr )
		{}
		Target* release() const
		{
			*pptr_ = 0;
			return ptr_;
		}
		void** pptr_;
		Target* ptr_;
	};
	template&lt;typename Target&gt;
	class auto_ptr_ref&lt; Target, true &gt;
	{
		template&lt;typename&gt;
		friend class auto_ptr;
		explicit auto_ptr_ref(void** pptr, Target*) throw()
			: pptr_( pptr )
		{}
		Target* release() const
		{
			Target* ptr = static_cast&lt; Target* &gt;( *pptr_ );
			*pptr_ = 0;
			return ptr;
		}
		void** pptr_;
	};
// ...

		auto_ptr(auto_ptr_ref&lt; Pointee, false &gt; rhs) throw()
			: ptr_( rhs.release() )
		{}
		auto_ptr(auto_ptr_ref&lt; Pointee, true &gt; rhs) throw()
			: ptr_( rhs.release() )
		{}
// ...
		template&lt;typename Target&gt;
		operator auto_ptr_ref&lt; Target, boost::is_same&lt; Target, Pointee &gt;::value &gt;() throw()
		{
			// require complete type here
			// (implies that Target is complete or else conversion fails anyway)
			(void)sizeof Pointee;
                        // has_virtual_destructor works only with VC8, is_polymorphic is a weaker requirement
			BOOST_STATIC_ASSERT( ( \
				boost::is_same&lt; Target, Pointee &gt;::value \
					|| boost::is_polymorphic&lt; Target &gt;::value \
						&amp;&amp; boost::has_virtual_destructor&lt; Target &gt;::value ) );
			return auto_ptr_ref&lt; Target, boost::is_same&lt; Target, Pointee &gt;::value &gt;( &amp;ptr_, get() );
		}

// etc...
</code></pre>
<p>wenn es gelänge, die offset-verschiebung beim kompilieren zu ermitteln (oder wenigstens alle fälle, in denen keine verschiebung stattfindet, insbesondere der gewöhnliche single-inheritance fall) - könnte die optimierung auf diese fälle erweitert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926162</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 24 Nov 2005 15:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 15:56:24 GMT]]></title><description><![CDATA[<p>nocheinmal zur motivation:<br />
der auto_ptr von vc8 hat einen tödlichen defekt, wie ich schon angedeutet habe,<br />
in vc7.1 ist der auto_ptr komplett kaputt was zuweisung von kompatiblen rvalues angeht.</p>
<p>beiden vc++ versionen als auch alle gcc versionen (d.h. die standardbibliothek, die jeweils dazu gehört) kommen nicht mit mehrfachvererbung zurecht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;memory&gt;

struct A
{
	virtual ~A() {}
	int i;
};
struct B
{
	virtual ~B() {}
	int i;
};
struct C : A, B
{
	C()
	{
		A::i = 1;
		B::i = 2;
	}
};

using namespace std;

auto_ptr&lt; C &gt; foo() { return auto_ptr&lt; C &gt;( new C ); }

int main()
{
	C* c = new C;
	A* a = c;
	B* b = c;
	cout &lt;&lt; &quot;raw:  &quot; &lt;&lt; a-&gt;i &lt;&lt; &quot;  &quot; &lt;&lt; b-&gt;i &lt;&lt; endl;
	delete c;
	auto_ptr&lt; A &gt; aa( foo() );
	cout &lt;&lt; &quot;auto: &quot; &lt;&lt; aa-&gt;i &lt;&lt; &quot;  &quot;;
	auto_ptr&lt; B &gt; ab( foo() );
	cout &lt;&lt; ab-&gt;i &lt;&lt; endl;
}
</code></pre>
<p>eine implementierung, die funktioniert, ist z.b. die von STLport, dort wird auch ein doppel-pointer ansatz verfolgt. allerdings ist dieser ansatz soboptimal im gewöhnlichen fall. zu erwähnen wäre noch, dass diese optimierung tatsächlich eine rolle spielt - z.b. wird visual c++ eine funktion, die ein objekt mit nicht-trivialen destruktor - wie z.b. auto_ptr - zurückgibt, niemals inlinen (wenn C++ exceptions erlaubt sind), was zur folge hat, dass auch das auto_ptr_ref objekt nicht eliminiert werden kann. jede vereinfachung dieses proxies erhöht die qualität das endgültigen assembler codes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926190</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 24 Nov 2005 15:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 16:16:57 GMT]]></title><description><![CDATA[<p>ich weiß nicht, was du dir erwartest?<br />
als ausgabe bekomme ich</p>
<p>programm schrieb:</p>
<blockquote>
<p>raw: 1 2<br />
auto: 1 2</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/926216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926216</guid><dc:creator><![CDATA[nanunu]]></dc:creator><pubDate>Thu, 24 Nov 2005 16:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to ausdruck durch konstanten ausdruck ersetzbar? on Thu, 24 Nov 2005 16:35:42 GMT]]></title><description><![CDATA[<p>mit g++, ja? ok, ich hab noch mal in die quellen geschaut - es klappt tatsächlich mit gcc, was mehrfachvererbung angeht. allerdings ist das ganze nicht mehr standardkonform, denn:</p>
<pre><code class="language-cpp">int main()
{
    auto_ptr&lt;C&gt; ac(foo());
    ac.operator auto_ptr_ref&lt;C&gt;();
    cout &lt;&lt; ac-&gt;A::i; // oops
}
</code></pre>
<p>zugegeben, sowas schreibt man ja nicht, aber es ist durchaus zulässig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/926240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/926240</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 24 Nov 2005 16:35:42 GMT</pubDate></item></channel></rss>