<?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[objekte aus parameter pack erstellen]]></title><description><![CDATA[<p>Ich steh gerade auf dem schlauch, ich will sowas wie:</p>
<pre><code>#include &lt;vector&gt;

struct Aware {};
struct Aware1 : public Aware {};
struct Aware2 : public Aware {};

template&lt;typename... Params&gt;
class Material
{
public:
	Material()
	{
		Push&lt;Params...&gt;();
	}

	template&lt;typename... Params&gt;
	void Push()
	{
		// call Add&lt;T&gt;() für jedes argument
		// bzw irgendwie die objekte aus dem pack erstellen
	}
private:
	template&lt;typename T&gt;
	void Add()
	{
		awares.push_back(new T());
	}

	std::vector&lt;Aware*&gt; awares;
};

int main() 
{
	Material&lt;Aware1, Aware2&gt; mat;
}
</code></pre>
<p>kriegs leider nicht hin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326008/objekte-aus-parameter-pack-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 14:44:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326008.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 May 2014 00:33:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 00:33:14 GMT]]></title><description><![CDATA[<p>Ich steh gerade auf dem schlauch, ich will sowas wie:</p>
<pre><code>#include &lt;vector&gt;

struct Aware {};
struct Aware1 : public Aware {};
struct Aware2 : public Aware {};

template&lt;typename... Params&gt;
class Material
{
public:
	Material()
	{
		Push&lt;Params...&gt;();
	}

	template&lt;typename... Params&gt;
	void Push()
	{
		// call Add&lt;T&gt;() für jedes argument
		// bzw irgendwie die objekte aus dem pack erstellen
	}
private:
	template&lt;typename T&gt;
	void Add()
	{
		awares.push_back(new T());
	}

	std::vector&lt;Aware*&gt; awares;
};

int main() 
{
	Material&lt;Aware1, Aware2&gt; mat;
}
</code></pre>
<p>kriegs leider nicht hin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2401173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401173</guid><dc:creator><![CDATA[foofel]]></dc:creator><pubDate>Wed, 28 May 2014 00:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 07:17:53 GMT]]></title><description><![CDATA[<p>Erstens scheint es mir nicht sinnvoll, aus <code>Material</code> ein Template zu machen, wenn du die Elemente sowieso abstrakt speicherst. Mit statischer Typinformation kannst du gleich ein effizienteres <code>std::tuple</code> nehmen. Ich würde also eher eine Typliste an den Konstruktor übergeben.</p>
<p>Durch die Typen im Parameter-Pack iterieren kannst du mittels Rekursion. Schau dir z.B. mal das Beispiel <a href="http://msdn.microsoft.com/en-us/library/dn439779.aspx" rel="nofollow">hier</a> an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2401186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401186</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 28 May 2014 07:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 08:25:18 GMT]]></title><description><![CDATA[<p>Du kannst auch den Array-Trick nutzen:</p>
<pre><code>template&lt;typename... Params&gt;
void Push()
{
  char arr[] = {(Add&lt;Param&gt;(), 0)...};
}
</code></pre>
<p>Aber nicht ganz sinnvoll ist es trotzdem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2401197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401197</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 28 May 2014 08:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 11:26:05 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Du kannst auch den Array-Trick nutzen:</p>
<pre><code>template&lt;typename... Params&gt;
void Push()
{
  char arr[] = {(Add&lt;Param&gt;(), 0)...};
}
</code></pre>
<p>Aber nicht ganz sinnvoll ist es trotzdem.</p>
</blockquote>
<p>Danke das funktioniert super <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="🙂"
    /> Könntest du vielleicht noch erläuftern was genau da passiert? mir erschließt sich das noch nicht. vorallem</p>
<pre><code>(Add&lt;Param&gt;(), 0)
</code></pre>
<p>Er versucht das paramter pack zu expanden, aber wieso &quot;,0&quot; ?</p>
<p>Ps. Ja vielleicht nicht ganz sinnvoll aber ich bin eh nur am rumspielen <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/2401219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401219</guid><dc:creator><![CDATA[foofel]]></dc:creator><pubDate>Wed, 28 May 2014 11:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 11:42:26 GMT]]></title><description><![CDATA[<p>Komma-Operator.<br />
In einer Array-Initialisierung kann man packs so ausrollen.<br />
Allerdings muss der Ausdruck einen gültigen Wert zurückliefern, mit dem das Array befüllt werden kann. Deine Funktion liefert void zurück, also nutze ich den Komma-Operator um das Arrayelement anschließend mit 0 zu initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2401222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401222</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 28 May 2014 11:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to objekte aus parameter pack erstellen on Wed, 28 May 2014 13:02:39 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Macht sinn, danke <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>Ps. habs jetzt in anlehnung an nexus so gemacht <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>
<pre><code>#include &lt;vector&gt;
#include &lt;utility&gt;
#include &lt;memory&gt;

struct Aware { int a; };
struct Aware1 : public Aware { int b; };
struct Aware2 : public Aware { int c; };

class Material
{
public:
	template&lt;class... Types&gt;
	Material(Types&amp;&amp;... args)
	{
		Add&lt;Types...&gt;(std::forward&lt;Types&gt;(args)...);
	}

private:
	template&lt;typename Elem, typename... Types&gt;
	void Add(Elem&amp;&amp; elem, Types&amp;&amp;... args)
	{
		awares.push_back(std::move(elem));
		Add(std::forward&lt;Types&gt;(args)...);
	}

	template&lt;typename Elem&gt;
	void Add(Elem&amp;&amp; elem)
	{
		awares.push_back(std::move(elem));
	}

	template&lt;typename... Types&gt;
	void Add(){}

	std::vector&lt;std::unique_ptr&lt;Aware&gt;&gt; awares;
};

int main() 
{
	Material mat(std::make_unique&lt;Aware1&gt;());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2401240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2401240</guid><dc:creator><![CDATA[foofel]]></dc:creator><pubDate>Wed, 28 May 2014 13:02:39 GMT</pubDate></item></channel></rss>