<?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[ein Zeiger auf Member einer Template-Klasse unterschiedlichen Typs]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>die Formulierung meiner Frage mag etwas schwammig sein - ich versuche sie an einem Beispiel zu konkretisieren:</p>
<p>Eine extra simple Klasse:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Bsp
{   public:
    T A;
    T B;
};
</code></pre>
<p>Eine noch simplere Funktion:</p>
<pre><code class="language-cpp">void StatusAbfragen()
{
   if (Status.A == 0) { MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufA))}
   if (Status.B == 0) { MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufB))}
}
</code></pre>
<p>Ein paar Instanzen:</p>
<pre><code class="language-cpp">Bsp&lt;int&gt; Status;
Bsp&lt;int&gt; Integer;
Bsp&lt;double&gt; Double;
</code></pre>
<p>und die Funktion MachZeugs:</p>
<pre><code class="language-cpp">void MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufMember)
{
   Status.*ZeigerAufMember = 1;
   Integer.*ZeigerAufMember = 1;
   Double.*ZeigerAufMember = 1;   // natürlich nicht möglich
}
</code></pre>
<p>Kann man den &quot;ZeigerAufMember&quot; vom Typ des Objekts unabhängig machen?<br />
Also so, dass es möglich wäre immer auf X zu zeigen, egal ob Bsp&lt;int&gt;.X oder Bsp&lt;double&gt;.X<br />
und die Funktion &quot;MachZeugs&quot; so funktionieren würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247066/ein-zeiger-auf-member-einer-template-klasse-unterschiedlichen-typs</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 19:25:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247066.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Aug 2009 14:55:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ein Zeiger auf Member einer Template-Klasse unterschiedlichen Typs on Wed, 05 Aug 2009 14:58:42 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>die Formulierung meiner Frage mag etwas schwammig sein - ich versuche sie an einem Beispiel zu konkretisieren:</p>
<p>Eine extra simple Klasse:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class Bsp
{   public:
    T A;
    T B;
};
</code></pre>
<p>Eine noch simplere Funktion:</p>
<pre><code class="language-cpp">void StatusAbfragen()
{
   if (Status.A == 0) { MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufA))}
   if (Status.B == 0) { MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufB))}
}
</code></pre>
<p>Ein paar Instanzen:</p>
<pre><code class="language-cpp">Bsp&lt;int&gt; Status;
Bsp&lt;int&gt; Integer;
Bsp&lt;double&gt; Double;
</code></pre>
<p>und die Funktion MachZeugs:</p>
<pre><code class="language-cpp">void MachZeugs(int Bsp&lt;int&gt;::* ZeigerAufMember)
{
   Status.*ZeigerAufMember = 1;
   Integer.*ZeigerAufMember = 1;
   Double.*ZeigerAufMember = 1;   // natürlich nicht möglich
}
</code></pre>
<p>Kann man den &quot;ZeigerAufMember&quot; vom Typ des Objekts unabhängig machen?<br />
Also so, dass es möglich wäre immer auf X zu zeigen, egal ob Bsp&lt;int&gt;.X oder Bsp&lt;double&gt;.X<br />
und die Funktion &quot;MachZeugs&quot; so funktionieren würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755834</guid><dc:creator><![CDATA[Qwetchen]]></dc:creator><pubDate>Wed, 05 Aug 2009 14:58:42 GMT</pubDate></item><item><title><![CDATA[Reply to ein Zeiger auf Member einer Template-Klasse unterschiedlichen Typs on Wed, 05 Aug 2009 15:13:12 GMT]]></title><description><![CDATA[<p>Ich habe nicht so recht verstanden, was du möchtest, aber vielleicht hilft dir der folgende Code, welcher grundsätzlich vedeutlichen soll, dass man auch Funktionstemplates machen kann:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

template&lt;typename T&gt;
struct Foo
{
    T a;
    T b;
};

template&lt;typename T&gt;
void bar(Foo&lt;T&gt;&amp; obj, T Foo&lt;T&gt;::*ptr2member, T const&amp; value)
{
    obj.*ptr2member = value;
}

int main()
{
    Foo&lt;int&gt; integer;
    Foo&lt;double&gt; floating;

    bar(integer, &amp;Foo&lt;int&gt;::a, 40);
    bar(floating, &amp;Foo&lt;double&gt;::b, 3.0);

    std::cout &lt;&lt; integer.a &lt;&lt; std::endl;
    std::cout &lt;&lt; floating.b &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Ein Zeiger auf ein Member eines Objektes, kannst du allerdings nicht vom Objekt unabhängig machen. Das macht schon nur in der Logik keinen Sinn. Du brauchst schliesslich ein Objekt, wenn du einen Zeiger auf ein Member eines Objektes hast, sonst ist nicht bekannt, welches Objekt gemeint ist.<br />
Aber vielleicht wäre es auch eine Idee, dass du einen ganz normalen Zeiger oder Referenz verwendest?</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Foo
{
    T a;
    T b;
};

template&lt;typename T&gt;
void bar(T&amp; var, T const&amp; value)
{
    var = value;
}

int main()
{
    Foo&lt;int&gt; integer;
    Foo&lt;double&gt; floating;

    bar(integer.a, 40);
    bar(floating.b, 3.0);

    // bzw. sowas geht auch:
    int* pa = &amp;integer.a;
    double* pb = &amp;floating.b;

    return 0;
}
</code></pre>
<p>Naja, vielleicht habe ich bereits ins schwarze getroffen, ansonsten wäre es gut, wenn du dich ein wenig deutlicher ausdrücken könntest.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755839</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 05 Aug 2009 15:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to ein Zeiger auf Member einer Template-Klasse unterschiedlichen Typs on Wed, 05 Aug 2009 16:40:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Naja, vielleicht habe ich bereits ins schwarze getroffen, ansonsten wäre es gut, wenn du dich ein wenig deutlicher ausdrücken könntest.</p>
</blockquote>
<p>Ich meine einen Zeiger der auf Member von Instanzen einer Template-Klasse zeigt, auch wenn die Instanzen mit unterschiedlichen Typen erzeugt wurden. (Da sich die Objekte unterschiedlichen Typs in der Größe unterscheiden und nicht in der Struktur (soll heissen: jede Instanz hat gleichnamige Member &amp; Methoden), könnte ich mir vorstellen das man das bewerkstelligen kann.)</p>
<p>Ich habe eine Klasse</p>
<pre><code class="language-cpp">template&lt;class T&gt; Container
{
T MemberA;
T MemberB;
};
</code></pre>
<p>und erzeuge einige/viele Instanzen mit unterschiedlichen Typen davon</p>
<pre><code class="language-cpp">Container&lt;int&gt; Int;
Container&lt;double&gt; Double;
Container&lt;char&gt; Char;
</code></pre>
<p>Jetzt möchte ich von allen &quot;MemberA&quot; ansprechen. Kann ich das mit einem Zeiger hinbekommen oder brauche ich für jeden einen eigenen (wegen unterschiedlichem Typ)?</p>
<pre><code class="language-cpp">void MachWas( ZeigerAufEinMember )
{
   Int.*ZeigerAufMember = 0;
   Double.*ZeigerAufMember = 0;
   Char.*ZeigerAufMember = 0;
}
MachWas( ZeigerAufMemberA );  // MemberA ist jetzt überall 0
MachWas( ZeigerAufMemberB );  // MemberB ist jetzt überall 0
</code></pre>
<p>Alternativ bräuchte ich zwei Funktionen:</p>
<pre><code class="language-cpp">void AlleMemberAAufNull()
{
   Int.A = 0;
   Double.A = 0;
   Char.A = 0;
}
void AlleMemberBAufNull()
{
   Int.B = 0;
   Double.B = 0;
   Char.B = 0;
}
AlleMemberAAufNull();  // MemberA ist jetzt überall 0
AlleMemberBAufNull();  // MemberB ist jetzt überall 0
</code></pre>
<p>Wenn &quot;MachWas&quot; eine gewisse Länge und Komplexität hat, wäre es imho einfacher<br />
diesen mysteriösen Zeiger verwenden zu können und die Funktion nur einmal<br />
schreiben zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755886</guid><dc:creator><![CDATA[Qwetchen]]></dc:creator><pubDate>Wed, 05 Aug 2009 16:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to ein Zeiger auf Member einer Template-Klasse unterschiedlichen Typs on Wed, 05 Aug 2009 18:17:44 GMT]]></title><description><![CDATA[<p>Qwetchen schrieb:</p>
<blockquote>
<p>Ich meine einen Zeiger der auf Member von Instanzen einer Template-Klasse zeigt, auch wenn die Instanzen mit unterschiedlichen Typen erzeugt wurden.</p>
</blockquote>
<p>Warum eigentlich so umständlich, und nicht als member function der Template Klasse? Man kann auch Template Spezialisierung verwenden. Ich hoffe das ist bekannt.</p>
<p>Eine mögliche Variante wäre folgende. Aber auch hier läßt sich das int in Foo&lt;int&gt;::foo nicht vermeiden.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class Bsp {
public:
    typedef T* Pointer;
    T A;
    T B;
};

template &lt;typename T, template &lt;typename T&gt; class C = Bsp &gt;
class Foo {
public:
    void static foo (C&lt;T&gt;&amp; c) {
        c.A = 1;
    }
};

int main () {
    Bsp&lt;int&gt; Status;
    Bsp&lt;int&gt; Integer;
    Bsp&lt;double&gt; Double;

    Foo&lt;int&gt;::foo (Status);
    Foo&lt;int&gt;::foo (Integer);
    Foo&lt;double&gt;::foo(Double);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755932</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 05 Aug 2009 18:17:44 GMT</pubDate></item></channel></rss>