<?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[Typ eines Klassen-Attributes als template typ]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Folgender Code funktioniert:</p>
<pre><code>template &lt;class SendMessageType&gt;
class Sender
{
public:
	void Send(SendMessageType&amp; data)
	{
		// ...
	}
};

template &lt;class MessageType, class InternalType&gt;
class Distributor
{
public:
	Distributor()
	{
		sender = new Sender&lt;InternalType&gt;();
	}

	void Distribute(MessageType&amp; msg)
	{
		sender-&gt;Send(msg.data);
	}

	Sender&lt;InternalType&gt;* sender;
};

template &lt;class InternalType&gt;
class Message
{
public:
	string someMetaInformation;
	InternalType data;
};

class TypeA {};

class MessageA : public Message&lt;TypeA&gt;
{
};

class TypeB {};

class MessageB : public Message&lt;TypeB&gt;
{
};

int main()
{
	Distributor&lt;MessageA, TypeA&gt; dist;
	MessageA myData;
	dist.Distribute(myData);

	return 0;
}
</code></pre>
<p>Mich stört daran aber, dass ein Benutzer der Klassen (das Beispiel ist Teil eines Frameworks, das ich entwickle) für den Distributor immer 2 template typen angeben muss.</p>
<ol>
<li>Den Typ der Message (z.B. MessageA oder MessageB)</li>
<li>Den internen Typen der Message, also den Typen des Members Message::data</li>
</ol>
<p>Daher lautet die Frage: Kann ich die template deklaration der Klasse Distributor so gestalten, das ich nur den Typen der Message (z.B. MessageA oder MessageB) übergebe und der Compiler daraus den internen Typen des Members Message::data automatisch herausfindet?</p>
<p>Etwa in dieser Art (Pseudocode):</p>
<pre><code>template &lt;class MessageType, class InternalType &amp;MessageType::data&gt;
class Distributor
{
 //...
};
</code></pre>
<p>Grüße,<br />
DarthZiu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327806/typ-eines-klassen-attributes-als-template-typ</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 22:44:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327806.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Sep 2014 08:00:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:00:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Folgender Code funktioniert:</p>
<pre><code>template &lt;class SendMessageType&gt;
class Sender
{
public:
	void Send(SendMessageType&amp; data)
	{
		// ...
	}
};

template &lt;class MessageType, class InternalType&gt;
class Distributor
{
public:
	Distributor()
	{
		sender = new Sender&lt;InternalType&gt;();
	}

	void Distribute(MessageType&amp; msg)
	{
		sender-&gt;Send(msg.data);
	}

	Sender&lt;InternalType&gt;* sender;
};

template &lt;class InternalType&gt;
class Message
{
public:
	string someMetaInformation;
	InternalType data;
};

class TypeA {};

class MessageA : public Message&lt;TypeA&gt;
{
};

class TypeB {};

class MessageB : public Message&lt;TypeB&gt;
{
};

int main()
{
	Distributor&lt;MessageA, TypeA&gt; dist;
	MessageA myData;
	dist.Distribute(myData);

	return 0;
}
</code></pre>
<p>Mich stört daran aber, dass ein Benutzer der Klassen (das Beispiel ist Teil eines Frameworks, das ich entwickle) für den Distributor immer 2 template typen angeben muss.</p>
<ol>
<li>Den Typ der Message (z.B. MessageA oder MessageB)</li>
<li>Den internen Typen der Message, also den Typen des Members Message::data</li>
</ol>
<p>Daher lautet die Frage: Kann ich die template deklaration der Klasse Distributor so gestalten, das ich nur den Typen der Message (z.B. MessageA oder MessageB) übergebe und der Compiler daraus den internen Typen des Members Message::data automatisch herausfindet?</p>
<p>Etwa in dieser Art (Pseudocode):</p>
<pre><code>template &lt;class MessageType, class InternalType &amp;MessageType::data&gt;
class Distributor
{
 //...
};
</code></pre>
<p>Grüße,<br />
DarthZiu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416172</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:10:01 GMT]]></title><description><![CDATA[<p>Etwa so?</p>
<pre><code>template &lt;class MessageType&gt; 
class Distributor 
{
    using InternalType = decltype(MessageType::data);
};
</code></pre>
<p>Und wenn das nicht kompiliert (da dein Compiler <code>decltype</code> nicht unterstützt), deklariere doch ein Typedef <code>internal_type</code> in <code>Message</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416175</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:11:29 GMT]]></title><description><![CDATA[<p>Ja, wär schön. Hab aber leider vergessen, dass ich nicht mit C++11 arbeite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416177</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:14:32 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Und wenn das nicht kompiliert (da dein Compiler <code>decltype</code> nicht unterstützt), deklariere doch ein Typedef <code>internal_type</code> in <code>Message</code> .</p>
</blockquote>
<p>Könntest du bitte ein kurzes Syntax-Beispiel posten? Ich weiß gerade nicht so recht, wie ich den typedef dann benutzen soll.</p>
<p>DarthZiu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416178</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:14:32 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:18:45 GMT]]></title><description><![CDATA[<p>Oder füge einfach zu deiner Message-Klasse noch einen 'typedef' hinzu:</p>
<pre><code class="language-cpp">typedef InternalType type;
</code></pre>
<p>und benutze diesen dann in deinem Klassen-Template</p>
<pre><code class="language-cpp">template &lt;class MessageType&gt;
class Distributor
{
public:
    Distributor()
    {
        sender = new Sender&lt;typename MessageType::type&gt;();
    }
}
</code></pre>
<p>Oder auch hier wieder ein 'typedef':</p>
<pre><code class="language-cpp">typedef InternalType typename MessageType::type;
</code></pre>
<p>Dies funktioniert auch noch für C++98 (bzw. C++03).</p>
<p>Aber eleganter ist wohl der neuere Ansatz mittels 'using'.</p>
<p>Edit: oh, wie gut, daß ich meinen Beitrag doch nicht verworfen habe, nachdem Arcoth gepostet hatte <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/2416179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416179</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:26:35 GMT]]></title><description><![CDATA[<blockquote>
<pre><code>typedef InternalType typename MessageType::type;
</code></pre>
</blockquote>
<p>Bitte korrigieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416181</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:39:03 GMT]]></title><description><![CDATA[<p>Na gut:</p>
<pre><code class="language-cpp">typedef typename MessageType::type InternalType;
</code></pre>
<p>Wollte doch nur DarthZiu (und dich <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="😉"
    /> testen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416183</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Klassen-Attributes als template typ on Fri, 05 Sep 2014 08:44:31 GMT]]></title><description><![CDATA[<p>You made my day!</p>
<p>Grandios, vielen Dank euch beiden. Habe gestern einen halben Tag vor Google verbracht, aber diese Lösung habe ich nicht gefunden.</p>
<p>Grüße,<br />
DarthZiu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416185</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 05 Sep 2014 08:44:31 GMT</pubDate></item></channel></rss>