<?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[Alternative zu initializer_list]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich würde gerne dem Konstruktor einer Klasse beliebig viele Elemente des<br />
gleichen Typs übergeben. In C++11 ist dies ja relativ einfach über initializer_list (so wie unten) möglich.</p>
<p>Mein Kompiler unterstützt leider kein C++11 und deshalb wollte ich fragen ob<br />
es trotzdem eine Möglichkeit gibt oder ob es nur die Möglichkeit gibt, meine Objekte zuvor in ein Vektor zu speichern und diesen danach dem Konstruktor zu übergeben.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include&lt;initializer_list&gt;
using namespace std;

class Ausgabe{
public:
	void show(){ cout &lt;&lt; var &lt;&lt; &quot;\n&quot;; }
	Ausgabe(int varK) : var(varK) {}
private:
	int var;
};

class foo{
public:
	foo(initializer_list&lt;Ausgabe&gt; liste);
	void show();
private:
	vector&lt;Ausgabe&gt; storage;
};

foo::foo(initializer_list&lt;Ausgabe&gt; liste){
	storage.assign(liste);
}

void foo::show(){
	cout &lt;&lt; &quot;Elemente:&quot; &lt;&lt; &quot;\n&quot;;
	for (auto element : storage){
		element.show();
	}
}

int main()
{
	foo Ausgaben{ Ausgabe(1), Ausgabe(2), Ausgabe(3) };
	Ausgaben.show();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/331140/alternative-zu-initializer_list</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 22:19:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331140.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Feb 2015 16:09:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 16:09:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich würde gerne dem Konstruktor einer Klasse beliebig viele Elemente des<br />
gleichen Typs übergeben. In C++11 ist dies ja relativ einfach über initializer_list (so wie unten) möglich.</p>
<p>Mein Kompiler unterstützt leider kein C++11 und deshalb wollte ich fragen ob<br />
es trotzdem eine Möglichkeit gibt oder ob es nur die Möglichkeit gibt, meine Objekte zuvor in ein Vektor zu speichern und diesen danach dem Konstruktor zu übergeben.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include&lt;initializer_list&gt;
using namespace std;

class Ausgabe{
public:
	void show(){ cout &lt;&lt; var &lt;&lt; &quot;\n&quot;; }
	Ausgabe(int varK) : var(varK) {}
private:
	int var;
};

class foo{
public:
	foo(initializer_list&lt;Ausgabe&gt; liste);
	void show();
private:
	vector&lt;Ausgabe&gt; storage;
};

foo::foo(initializer_list&lt;Ausgabe&gt; liste){
	storage.assign(liste);
}

void foo::show(){
	cout &lt;&lt; &quot;Elemente:&quot; &lt;&lt; &quot;\n&quot;;
	for (auto element : storage){
		element.show();
	}
}

int main()
{
	foo Ausgaben{ Ausgabe(1), Ausgabe(2), Ausgabe(3) };
	Ausgaben.show();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2442460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442460</guid><dc:creator><![CDATA[Hoselupf]]></dc:creator><pubDate>Thu, 12 Feb 2015 16:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 16:24:16 GMT]]></title><description><![CDATA[<p>Wenn die Elemente später sowieso wieder in einem Vector landen, sehe ich nichts was dagegen spricht gleich den Vector als const ref zu übergeben oder foo vorher zu initialisieren und dann eine Funktion &quot;Add Ausgabe&quot; aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442463</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Thu, 12 Feb 2015 16:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 16:22:59 GMT]]></title><description><![CDATA[<p>Folgendes könnte interessant für dich sein: <a href="http://erdani.com/publications/inline_containers.html" rel="nofollow">http://erdani.com/publications/inline_containers.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442464</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 12 Feb 2015 16:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 16:37:01 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Folgendes könnte interessant für dich sein: <a href="http://erdani.com/publications/inline_containers.html" rel="nofollow">http://erdani.com/publications/inline_containers.html</a></p>
</blockquote>
<p>Hübsche Idee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442466</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Thu, 12 Feb 2015 16:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 21:50:06 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Folgendes könnte interessant für dich sein: <a href="http://erdani.com/publications/inline_containers.html" rel="nofollow">http://erdani.com/publications/inline_containers.html</a></p>
</blockquote>
<p>Vielen Dank Shade Of Mine, funktioniert einwandfrei!</p>
<p>Ruvi schrieb:</p>
<blockquote>
<p>Wenn die Elemente später sowieso wieder in einem Vector landen, sehe ich nichts was dagegen spricht gleich den Vector als const ref zu übergeben oder foo vorher zu initialisieren und dann eine Funktion &quot;Add Ausgabe&quot; aufzurufen.</p>
</blockquote>
<p>Ja das ist sicher so, ich habe mich auch nur gefragt ob es eine ähnlich elegante Variante wie initializer_list gibt.</p>
<pre><code>#ifndef __INLINE_CONTAINER_H__
#define __INLINE_CONTAINER_H__

#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;deque&gt;

template &lt; class T, class container = std::vector&lt;T&gt; &gt;
class inline_container : public container
{
public:
	inline_container()
	{
	}
	inline_container(inline_container &amp;v)
	{
		this-&gt;swap(v);
	}
	explicit inline_container(const T &amp;a)
		: container(1, a)
	{
	}
	inline_container &amp;operator()(const T &amp;a)
	{
		this-&gt;push_back(a);
		return *this;
	}
};

template &lt;class T&gt;
inline inline_container&lt;T&gt; make_vector(const T &amp;a)
{
	return inline_container&lt;T&gt;(a);
}

#endif
</code></pre>
<pre><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &quot;InlineContainer.h&quot;
using namespace std;

class foo{
public:
	foo(std::vector&lt;Ausgabe&gt; liste);
	void show();
private:
	std::vector&lt;Ausgabe&gt; storage;
};

foo::foo(std::vector&lt;Ausgabe&gt; liste){
	storage = liste;
}

void foo::show(){
	cout &lt;&lt; &quot;Elemente:&quot; &lt;&lt; &quot;\n&quot;;
	for (auto element : storage){
		element.show();
	}
}

int main()
{

	foo Ausgaben(make_vector(Ausgabe(1))(Ausgabe(2))(Ausgabe(3)));
	Ausgaben.show();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2442478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442478</guid><dc:creator><![CDATA[Hoselupf]]></dc:creator><pubDate>Thu, 12 Feb 2015 21:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to Alternative zu initializer_list on Thu, 12 Feb 2015 21:51:51 GMT]]></title><description><![CDATA[<p>Hoselupf schrieb:</p>
<blockquote>
<p>Ja das ist sicher so, ich habe mich auch nur gefragt ob es eine ähnlich elegante Variante wie initializer_list gibt.</p>
</blockquote>
<p>Das trifft auf die <code>const reference</code> durchaus zu. Wenn dein Konstruktor von <code>foo</code> so aussieht:</p>
<pre><code>foo(const std::vector&lt;Ausgabe&gt;&amp; liste) 
: storage{ liste }
{
};
</code></pre>
<p>... dann kannst du das Ganze einfach so aufrufen:</p>
<pre><code>foo Ausgaben{ { 1, 2, 3 } };
Ausgaben.show();
</code></pre>
<p>Der einzige Unterschied ist, dass du dem Kosntruktor hier eine Initializer List übergeben musst (doppelte geschweifte Klammern), die dann an den Konstruktor des <code>vector</code> weitergereicht wird. Ich halte das für eleganter als die - zugegebenermaßen pfiffige, aber nicht mehr zeitgemäße Lösung mit dem Funktions-Operator (die stammt noch aus Zeiten bevor es variadische Templates und Initializer Lists gab).</p>
<p>Wenn du's optimal haben möchtest (aber mit kompliziertererem Code), kannst du es auch mit &quot;Perfect Forwarding&quot; versuchen:</p>
<pre><code>class foo{

    ...

    template &lt;typename... ARGS&gt;
    foo(ARGS&amp;&amp;... args) 
    : storage{ { std::forward&lt;ARGS&gt;(args)... } }
    {
    };

    ...
}

...

foo Ausgaben{ 1, 2, 3 };
Ausgaben.show();
</code></pre>
<p>... nur so als zwei Alternativen, die weniger Code benötigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442516</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Thu, 12 Feb 2015 21:51:51 GMT</pubDate></item></channel></rss>