<?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[Pointer to data member &amp;quot;casten&amp;quot;?]]></title><description><![CDATA[<p>Okay, mal wieder ein lustiges Problem!</p>
<p>Sagen wir, es gibt:</p>
<pre><code class="language-cpp">class A {};
class B : public A {};

class User {
   B some;
};
</code></pre>
<p>Jetzt ist &amp;User::some ja vom Typ B (User::<em>);<br />
Gibt es irgendwie einen Weg diesen Pointer-to-member in A (User::</em>) zu casten? Also dass ich über den Offset der dahinter steckt direkt auf die Basisklasse zugreifen kann und vor allem diese Zeiger in einem Array abspeichern kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331530/pointer-to-data-member-quot-casten-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 15:47:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331530.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2015 11:58:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 11:58:10 GMT]]></title><description><![CDATA[<p>Okay, mal wieder ein lustiges Problem!</p>
<p>Sagen wir, es gibt:</p>
<pre><code class="language-cpp">class A {};
class B : public A {};

class User {
   B some;
};
</code></pre>
<p>Jetzt ist &amp;User::some ja vom Typ B (User::<em>);<br />
Gibt es irgendwie einen Weg diesen Pointer-to-member in A (User::</em>) zu casten? Also dass ich über den Offset der dahinter steckt direkt auf die Basisklasse zugreifen kann und vor allem diese Zeiger in einem Array abspeichern kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445402</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 11:58:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 12:05:21 GMT]]></title><description><![CDATA[<p>Ich sollte anmerken, dass ich im Visual Studio CTP 2015 den cast versucht habe, aber der sagte mir, dass &quot;B&quot; nicht in &quot;A User::*&quot; konvertiert werden kann. Nun glaube ich Visual Studio oftmals nicht, außerdem ist der Typ &quot;B&quot; in der Fehlermeldung einfach falsch, also vertut sich entweder die Fehlermeldung oder mein Code ist einfach falsch. Ich könnte da auch ein simpel-Beispiel draus destillieren, falls der Cast ansonsten gültig wäre in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445404</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 12:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 12:08:57 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung lautet genau:</p>
<pre><code>error C2440: 'static_cast': cannot convert from 'up::bindings::integer_t&lt;Access&gt; ' to 'up::detail::dynamic_binding_base sample_struct::*
</code></pre>
<p>Der Quelltyp ist aber &quot;up::bindings::integer_t&lt;Access&gt; sample_struct::*&quot;, wobei &quot;up::bindings::integer_t&lt;Access&gt;&quot; öffentlich von &quot;up::detail::dynamic_binding_base&quot; ableitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445406</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 12:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 13:25:12 GMT]]></title><description><![CDATA[<p>Na gut, nur schnell mal das Beispiel, das ich da gegeben habe, ausprobiert:</p>
<pre><code>error C2440: 'initializing': cannot convert from 'B User::* ' to 'A User::* '
</code></pre>
<p>Die Konvertierung scheint also einfach nicht erlaubt zu sein, ja? Schade eigentlich... Ständig Steine im Weg mit C++...</p>
<p>Das einzige funktionsfähige, das ich jetzt habe ist, die Teile in unterschiedlichem Typ in einem std::tuple zu lagern und indizierten Zugriff mit einer linearen Suche (if( idx == 0 ) {...} else if {idx == 1) {...} else if ...&quot; durchzuführen und die Konvertierung auf dem dereferenzierten Zeiger durchzuführen... Dabei ist das doch einfach ein blöder Offset, verdammt nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445417</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 13:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 13:50:17 GMT]]></title><description><![CDATA[<p>Diese Art von Konvertierung ist nicht vorgesehen.</p>
<p>decimad schrieb:</p>
<blockquote>
<p>Dabei ist das doch einfach ein blöder Offset, verdammt nochmal.</p>
</blockquote>
<p>Solange keine virtuellen Basen im Spiel sind oder garantiert ist, dass Pointer auf Member immer auf ein most-derived-Objekt zeigen. Letzteres würde nicht mehr zutreffen, wenn die Konvertierung zulässig wäre. Ersteres könnte man explizit ausschließen, wenn man die Sprache entsprechend erweitern wollte.</p>
<p>Wenn du ein bisschen mehr Kontext gibst, findet sich evtl. eine andere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445421</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 05 Mar 2015 13:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 14:17:19 GMT]]></title><description><![CDATA[<p>Hallo camper!</p>
<p>Also Quell des Problem ist, dass ich gerade ausprobiere, was ich so an statischen Konstrukten für die komfortable Adaptierung bei Reflektion bereitstellen kann.</p>
<pre><code class="language-cpp">class some {

    INTEGRAL_METHOD_BINDER(get_something, set_something) something_binder;
    static const char something_id[];

    static_id_group&lt; my_class,
         group_descriptor&lt; something_id, decltype(&amp;my_class::something_binder), &amp;my_class::something_binder &gt;
    &gt; root_group;
}
</code></pre>
<p>Diese Root-Group bekommt jetzt also eine variable Anzahl von group_descriptor-Templates mit Member-Zeigern, die alle zu einer Basisklasse konvertiert werden &quot;könnten&quot;. static_id_group stellt dann eine Schnittstelle bereit, mit der man per Index den Zeiger auf diese Basisklassen bekommt, also:</p>
<pre><code class="language-cpp">template&lt; const char* Id, typename PtrType, PtrType Ptr &gt;
	struct group_descriptor
	{
		template&lt; typename T &gt;
		static binding access(T* cls) {
			// Konvertierung auf konkreter Instanz...
			return binding( &amp;(cls-&gt;*Ptr), false );
		}
	};

	namespace detail {

		// Rekursiver lookup -.-
		template&lt; typename TupleType, typename Class, unsigned int TupleSize, unsigned int Index &gt;
		struct dynamic_tuple {
			static binding get_binding(TupleType&amp; tuple, Class* ptr, unsigned int idx) {
				if (idx == Index) {
					return std::get&lt;Index&gt;(tuple).access(ptr);
				} else {
					return dynamic_tuple&lt;TupleType, Class, TupleSize, Index + 1&gt;::get_binding(tuple, ptr, idx);
				}
			}
		};

		template&lt; typename TupleType, typename Class, unsigned int TupleSize &gt;
		struct dynamic_tuple&lt; TupleType, Class, TupleSize, TupleSize &gt; {
			static binding get_binding(TupleType&amp; tuple, Class* ptr, unsigned int idx) {
				return binding(nullptr, false);
			}
		};

	}

	template&lt; typename Class, typename... Descriptors &gt;
	struct static_id_group : public id_group {
		static_id_group(Class* ptr)
			: ptr_(ptr)
		{}

		std::size_t num_bindings() const override {
			return sizeof...(Descriptors);
		}

		binding get_binding(std::size_t idx) {
			std::tuple&lt; Descriptors... &gt; tuple;
			return detail::dynamic_tuple&lt;decltype(tuple), Class, sizeof...(Descriptors), 0&gt;::get_binding(tuple, ptr_, idx);	
			//return binding( &amp;(ptr_-&gt;*elements[idx].Ptr), false );	// Das wäre schön!
		}

		const char* binding_name() const override {
			return &quot;id_group&quot;;
		}

		const type_info&amp; get_binding_info() const override {
			return typeid(id_group);
		}

	private:
		struct elem {
			const char* name;
			up::detail::dynamic_binding_base(Class::*Ptr);
		};

		// static elem elements[]; // Schade :(
		Class* ptr_;
	};

	/* Geht leider nicht
	template&lt; typename Class, typename... Descriptors &gt;
	typename static_id_group&lt;Class, Descriptors...&gt;::elem static_id_group&lt;Class, Descriptors...&gt;::elements[] =
	{
		{ &quot;&quot;, static_cast&lt;up::detail::dynamic_binding_base (Class::*)&gt;(Descriptors::ptr)}...
	};
	*/
</code></pre>
<p>Während das Tuple-Konstrukt &quot;funktioniert&quot;, aber eben diese if-else-Kette erzeugt (Man müsste mal überprüfen ob der Compiler begreift, dass hier im Prinzip ein &quot;zusammenhängender&quot; Lookup stattfindet), statt direkt einen Zeiger aus einem Feld zu fischen, bekomme ich das Konstrukt mit dem Array leider nicht zum kompilieren und mir fällt da auch kein Workaround ein.</p>
<p>Ich möchte also im Prinzip -&gt; pro Klasse &lt;- ein Array anlegen, mit dem man per Instanz-Zeiger und Index an die Schnittstellen herankommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2445427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445427</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 14:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to data member &amp;quot;casten&amp;quot;? on Thu, 05 Mar 2015 14:21:59 GMT]]></title><description><![CDATA[<p>Achso, bitte entschuldige die Namen, oder dass einige Member in den kommentierten Sektionen nicht mehr existieren. Das war die letzten Minuten sehr im Fluss <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2445428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2445428</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Thu, 05 Mar 2015 14:21:59 GMT</pubDate></item></channel></rss>