<?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[Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates]]></title><description><![CDATA[<p>Ich habe mehrere unabhängige Strukturen (generiert, kann ich nicht beeinflussen), die Heap-Arrays kapseln. Alle diese Strukturen haben ein Member size_t size und ein Member Subtype* array. Den Typ der Strukturen nenne ich mal Type.</p>
<p>Ich möchte nun eine Templatefunktion erstellen, die einen Wrapper für einen Zeiger auf diese Struktur zurückgibt. Dieser Wrapper muss aber den Subtype kennen, für den Rückgabetyp der Indexfunktion. Gibt es eine Möglichkeit, via Template an diesen Subtype heranzukommen?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">// Strukturen
struct ArrayOfX
{ 
   size_t size;
   X* array;
};

struct ArrayOfY
{
    size_t size;
    Y* array;
};

// Wrapper
template&lt; typename Type, typename Subtype &gt;
struct ArrayWrapper
{
    ArrayWrapper( Type*&amp; s ) : m_struct( s ) {}

    Subtype&amp; value( size_t index ) { return m_struct-&gt;item[ index ]; }

private:
    Type*&amp; m_struct;
};

// Templatefunktion
template&lt; typename Type &gt;
ArrayWrapper&lt; Type, /* ??? */ type_of&lt; &amp;Type::item &gt;::type &gt; ArrayOf( Type*&amp; s )
{
    return ArrayWrapper&lt; type, /* ??? */ &gt;( s );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/244369/bestimmung-des-result-typs-eines-pointer-to-member-via-templates</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 11:25:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244369.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Jun 2009 09:52:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 09:53:34 GMT]]></title><description><![CDATA[<p>Ich habe mehrere unabhängige Strukturen (generiert, kann ich nicht beeinflussen), die Heap-Arrays kapseln. Alle diese Strukturen haben ein Member size_t size und ein Member Subtype* array. Den Typ der Strukturen nenne ich mal Type.</p>
<p>Ich möchte nun eine Templatefunktion erstellen, die einen Wrapper für einen Zeiger auf diese Struktur zurückgibt. Dieser Wrapper muss aber den Subtype kennen, für den Rückgabetyp der Indexfunktion. Gibt es eine Möglichkeit, via Template an diesen Subtype heranzukommen?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">// Strukturen
struct ArrayOfX
{ 
   size_t size;
   X* array;
};

struct ArrayOfY
{
    size_t size;
    Y* array;
};

// Wrapper
template&lt; typename Type, typename Subtype &gt;
struct ArrayWrapper
{
    ArrayWrapper( Type*&amp; s ) : m_struct( s ) {}

    Subtype&amp; value( size_t index ) { return m_struct-&gt;item[ index ]; }

private:
    Type*&amp; m_struct;
};

// Templatefunktion
template&lt; typename Type &gt;
ArrayWrapper&lt; Type, /* ??? */ type_of&lt; &amp;Type::item &gt;::type &gt; ArrayOf( Type*&amp; s )
{
    return ArrayWrapper&lt; type, /* ??? */ &gt;( s );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1734445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734445</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 29 Jun 2009 09:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:08:35 GMT]]></title><description><![CDATA[<p>Ist die Menge an Strukturen begrenzt? Wenn nicht, sehe ich da bei C++03 eher schwarz. Und selbst bei begrenzter Menge ist die Lösung die mir einfällt eher krampfig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734475</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:23:25 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_38_0/doc/html/typeof/tuto.html" rel="nofollow">BOOST_TYPEOF</a>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734479</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:23:25 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:26:26 GMT]]></title><description><![CDATA[<p>mach folgendes:</p>
<p>a)Definiere ein Traits-Template für die Strukturen, wo du den Subtype als typedef drin hast.<br />
b1) Wenn du die Strukturen selber definierst/generierst, packe noch ein typedef für die subtypen rein, im Traits geht das typedef dann auf den typedef im struct.<br />
b2) Für fremddefinierte Strukturen spezialisierst du den trait</p>
<pre><code class="language-cpp">template &lt;class Type&gt;
struct MemarrayTraits
{
  typedef Type::subtype subtype; //default: das struct definiert selber den subtype
};

template&lt; typename Type &gt;
struct ArrayWrapper
{
    typedef MemarrayTraits&lt;Type&gt;::subtype Subtype; //die traits bestimmen den subtype
    ArrayWrapper( Type*&amp; s ) : m_struct( s ) {}

    Subtype&amp; value( size_t index ) { return m_struct-&gt;item[ index ]; }

private:
    Type*&amp; m_struct;
};

// Strukturen
struct MyOwnArrayOfX //selbstgeschrieben
{
   size_t size;
   X* array;
   typedef X subtype; 
};

struct TheirArrayOfY //fremdgeschrieben...
{
    size_t size;
    Y* array;
};

//... daher Spezialisierung des traits, weil das struct den subtype nicht definiert
templyte&lt;&gt;
struct MemarrayTraits&lt;TheirArrayOfY&gt;
{
  typedef Y subtype;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1734480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734480</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:28:25 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_38_0/doc/html/typeof/tuto.html" rel="nofollow">BOOST_TYPEOF</a>?</p>
</blockquote>
<p>Und das hilft bei Template-Argumenten genau wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734482</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:31:01 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Das wäre die krampfige Methode, von der ich schrieb. Das wird aber ziemlich ätzend, wenn es sehr viele generierte Strukturtypen gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734484</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:38:24 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Das wäre die krampfige Methode, von der ich schrieb. Das wird aber ziemlich ätzend, wenn es sehr viele generierte Strukturtypen gibt.</p>
</blockquote>
<p>Wenn es einen weg gibt, die Strukturtypen zu generieren, dann wirds auch einen Weg geben, die Trait-Spezialisierungen zu generieren <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 />
Oder eben den generator umschreiben dass er das typedef noch mit dazubaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734490</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 11:44:40 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_38_0/doc/html/typeof/tuto.html" rel="nofollow">BOOST_TYPEOF</a>?</p>
</blockquote>
<p>Und das hilft bei Template-Argumenten genau wie?</p>
</blockquote>
<p>Gnarg, scheint echt nicht zu klappen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734493</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 29 Jun 2009 11:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 12:12:18 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Das wäre die krampfige Methode, von der ich schrieb. Das wird aber ziemlich ätzend, wenn es sehr viele generierte Strukturtypen gibt.</p>
</blockquote>
<p>Wenn es einen weg gibt, die Strukturtypen zu generieren, dann wirds auch einen Weg geben, die Trait-Spezialisierungen zu generieren <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 />
Oder eben den generator umschreiben dass er das typedef noch mit dazubaut.</p>
</blockquote>
<p>Also wir haben hier einen Generator, der aus einem IDL-Subset Code für unterschiedliche Sprachen generiert (u.a. C) generiert. Der weiss nichtmal, dass es Templates gibt. Erweiterungen sind da auch nicht denkbar.</p>
<p>Wenn man sowas privat gebastelt hat, klar. Dann kann man das erweitern wie man lustig ist.</p>
<p>Aber in Firmen, wo die Tools gesetzt sind? Wohl eher nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734512</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 29 Jun 2009 12:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 13:18:10 GMT]]></title><description><![CDATA[<p>Falls ein Makro anstatt einer Funktion in Ordnung ist:</p>
<pre><code class="language-cpp">#include &lt;boost/typeof/typeof.hpp&gt;

template&lt;class T&gt;
struct ExtractMemberType;

template&lt;class T, class E&gt;
struct ExtractMemberType&lt;E* T::*&gt;
{
	typedef E type;
};

struct X;
struct ArrayOfX
{
	X* array;
};

template&lt; typename Type, typename Subtype &gt;
struct ArrayWrapper
{
	ArrayWrapper( Type*&amp; )
	{
	}
};

#define ArrayWrapperType(s)  ArrayWrapper&lt; BOOST_TYPEOF(*s), ExtractMemberType&lt;BOOST_TYPEOF( &amp;BOOST_TYPEOF(*s)::array )&gt;::type &gt;
#define ArrayOf(s)  ArrayWrapper&lt; BOOST_TYPEOF(*s), ExtractMemberType&lt;BOOST_TYPEOF( &amp;BOOST_TYPEOF(*s)::array )&gt;::type &gt; (s)
// edit: bzw  #define ArrayOf(s)  ArrayWrapperType(s)(s)

template&lt;typename Type&gt;
void foo( Type* s )
{
	ArrayWrapperType(s) asd = ArrayOf( s );

	std::cout &lt;&lt; typeid(ArrayWrapperType(s)).name() &lt;&lt; &quot;\n&quot;; // -&gt; struct ArrayWrapper&lt;struct ArrayOfX,struct X&gt;
}

int main()
{
	ArrayOfX* s = NULL;

	foo( s );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1734540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734540</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 29 Jun 2009 13:18:10 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 13:34:35 GMT]]></title><description><![CDATA[<p>Naja, Sinn der Sache ist ja, möglichst nicht die aussenstehenden Beteiligten (sprich den Generator) zu modifizieren. Der ist nämlich tatsächlich nicht von uns.</p>
<p>Mit BOOST_TYPEOF würde es sogar funktionieren:</p>
<pre><code class="language-cpp">template&lt; typename Type &gt;
struct result_type_helper
{
    static Type* t;
    typedef BOOST_TYPEOF( t-&gt;item ) type;
};

template&lt; typename Type &gt;
struct ArrayWrapper
{
    typedef typename result_type_helper&lt; Type &gt;::type Subtype;

    /* ... */
};
</code></pre>
<p>Jetzt ist das Problem, dass einer der Compiler hier keine Typeof-Erweiterung kennt, und damit alle Typen wenn ich das richtig verstanden habe &quot;registriert&quot; werden müssen. Das kommt mehr oder weniger der Lösung von pumuckl gleich.</p>
<p>Den Makro-Vorschlag hab ich jetzt noch nicht angeschaut, Beitrag wurde vorher begonnen <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/1734554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734554</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 29 Jun 2009 13:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 14:15:34 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Naja, Sinn der Sache ist ja, möglichst nicht die aussenstehenden Beteiligten (sprich den Generator) zu modifizieren. Der ist nämlich tatsächlich nicht von uns.</p>
</blockquote>
<p>Etwas was mir noch eingefallen ist: Wenn die Structs generiert werden, sidn sie alle nach Schema F gestrickt. Die entsprechende Datei(en) sind auch leicht zu finden. Man könnte dann einen zusätzlichen Generator schreiben, der die &quot;Registrierung&quot; (d.h. Spezialisierung des Traits/Helpertemplates) vornimmt indem er die generierten Dateien parst und die Spezialisierungen schreibt - das parsen ist schnell erledigt, der Generator wäre ein recht kurzes Script, das man problemlos in jeden Buildprozess einbauen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734579</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Jun 2009 14:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 17:52:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;boost/type_traits.hpp&gt;

struct ArrayOfX
{
	std::size_t n;
	int* array;
};

template&lt;typename X&gt;
struct GetMemberType;

template&lt;typename C, typename M&gt;
struct GetMemberType&lt;M C::*&gt;
{
	typedef M Type;
};

template&lt;typename T, typename SubT&gt;
struct ArrayWrapper
{
	ArrayWrapper(T*&amp; s)
		: m_struct(s)
	{
	}

	SubT&amp; value(size_t index)
	{
		return m_struct-&gt;array[index];
	}

private:
	T*&amp; m_struct;
};

template&lt;typename T, typename X&gt;
ArrayWrapper
&lt;
	T,
	typename boost::remove_pointer&lt;typename GetMemberType&lt;X&gt;::Type&gt;::type
&gt;
ArrayOf(T*&amp; s, X)
{
	return
	ArrayWrapper
	&lt;
		T,
		boost::remove_pointer&lt;typename GetMemberType&lt;X&gt;::Type&gt;::type
	&gt;
	(s);
}

int main()
{
	ArrayOfX obj;
	ArrayOfX* p = &amp;obj;

	ArrayOf(p, &amp;ArrayOfX::array);

	return 0;
}
</code></pre>
<p>Ohne <code>&amp;ArrayOfX::array</code> habe ich es bisher noch nicht hinbekommen. Man könnte diesen Zeiger allerdings benutzen, falls es abweichende Namen gibt (*). Grundsätzlich könnte die aktuelle Lösung mehr als du verlangst. Sie um diese zusätzlichen Möglichkeiten zu verringern, dass ist mir halt noch nicht gelungen <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><code>GetMemberType</code> und <code>boost::remove_pointer</code> könnte man irgendwie noch zusätzlich verknüpfen, falls du möchtest. Ich war jetzt zu faul, dies noch hinzuschreiben.</p>
<p>Wieso hälst du eigentlich eine Referenz auf einen Zeiger im <code>ArrayWrapper</code> ? Ist nicht so günstig um einen <code>operator =</code> vom Kompiler generieren zu lassen <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>
<p>Edit:<br />
* Hier noch der angepasste Code, falls man abweichende Namen hat. Verändert wurden <code>ArrayWrapper</code> und <code>ArrayOf</code> :</p>
<pre><code class="language-cpp">template&lt;typename T, typename SubT&gt;
struct ArrayWrapper
{
	typedef typename boost::remove_pointer&lt;SubT&gt;::type value_type;

	ArrayWrapper(T* s, SubT T::*ptrToMember)
		: m_struct(s)
		, m_ptrToMember(ptrToMember)
	{
	}

	value_type&amp; value(size_t index)
	{
		return (m_struct-&gt;*m_ptrToMember)[index];
	}

private:
	T* m_struct;
	SubT T::* m_ptrToMember;
};

template&lt;typename T, typename X&gt;
ArrayWrapper
&lt;
	T,
	typename GetMemberType&lt;X&gt;::Type
&gt;
ArrayOf(T* s, X ptrToMember)
{
	return
	ArrayWrapper
	&lt;
		T,
		typename GetMemberType&lt;X&gt;::Type
	&gt;
	(s, ptrToMember);
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734667</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 29 Jun 2009 17:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmung des (Result)-Typs eines Pointer-To-Member via Templates on Mon, 29 Jun 2009 18:10:33 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wieso hälst du eigentlich eine Referenz auf einen Zeiger im <code>ArrayWrapper</code> ? Ist nicht so günstig um einen <code>operator =</code> vom Kompiler generieren zu lassen <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>Das ist im Zuge der Verkürzung reingekommen - im Real World Code ist es ein Doppelzeiger <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>Die Idee mit dem Memberzeiger hatte ich auch schon, da bräuchte man sogar kein Helfertemplate mehr - inkl. dem Versuch, &amp;T::array als Defaultparameter übergeben zu lassen, was der Compiler aber nicht wirklich mochte. Ist aber auch irgendwie klar, wie soll der Compiler auch den zweiten Templateparameter herleiten, bevor das dazugehörige Argument bekannt ist.</p>
<pre><code class="language-cpp">/* Verkürzte Version ohne Helper */
struct X
{
    int wert;
};

struct ArrayOfX
{
    size_t size;
    X* array;
};

template&lt; typename Struct, typename Type &gt;
struct ArrayWrapper
{
};

template&lt; typename Struct, typename Type &gt;
ArrayWrapper&lt; Struct, Type &gt; ArrayOf( Struct*&amp; capsule, Type* ( Struct::*array ) /* = &amp;Struct::array */ )
// das Default-Argument wird, wenn vorhanden, nichtmals angemeckert. Nur ist es kein wirklicher Default, weil der Aufruf mit einem Parameter nicht funktioniert.
{
    return ArrayWrapper&lt; Struct, Type &gt;();
}

int main()
{
    ArrayOfX* capsule = 0;
    ArrayOf( capsule, &amp;ArrayOfX::array );
}
</code></pre>
<p>Da wäre mir dann aber die Syntax <code>ArrayOf&lt; X &gt;( capsule );</code> für den Standardfall und <code>ArrayOf( capsule, &amp;ArrayOfX::abweichenderName );</code> für den Fall abweichender Namen lieber:</p>
<pre><code class="language-cpp">// Parameter vertauscht, wegen ArrayOf&lt; Type &gt;
template&lt; typename Type, typename Struct &gt;
ArrayWrapper&lt; Struct, Type &gt; ArrayOf( Struct*&amp; capsule, Type* ( Struct::*array ) = &amp;Struct::array )
{
    return ArrayWrapper&lt; Struct, Type &gt;();
}
</code></pre>
<p>Ich lasse mir aber tatsächlich auch nochmal die Möglichkeit eines Generators für eine automatische Traits-Erstellung durch den Kopf gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1734677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1734677</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 29 Jun 2009 18:10:33 GMT</pubDate></item></channel></rss>