<?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[Variable Parameterliste mit Objekten ?]]></title><description><![CDATA[<p>hi,</p>
<p>ich könnte für eine Collection einen Konstruktor mit variabler Parameterliste gebrauchen. Nun meldet mr meine IDE aber, dass die Verwendung von va_list mit einem non-POD zu einem laufzeitfehler führt.</p>
<p>Kann man da irgendwie einen work-around machen? das wäre nämlich ein häßliches workaround wenn es nicht gehen würde.</p>
<pre><code class="language-cpp">Collection::Collection(int c, ...)
{
	m_count = c;

	va_list vl;
	va_start(vl, c);

	m_member = new Set[c];

	for(int i=0; i &lt; c; i++)
		m_member[i] = va_arg(vl, Set);

	va_end(vl);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/227069/variable-parameterliste-mit-objekten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227069.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Nov 2008 13:27:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 13:27:47 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich könnte für eine Collection einen Konstruktor mit variabler Parameterliste gebrauchen. Nun meldet mr meine IDE aber, dass die Verwendung von va_list mit einem non-POD zu einem laufzeitfehler führt.</p>
<p>Kann man da irgendwie einen work-around machen? das wäre nämlich ein häßliches workaround wenn es nicht gehen würde.</p>
<pre><code class="language-cpp">Collection::Collection(int c, ...)
{
	m_count = c;

	va_list vl;
	va_start(vl, c);

	m_member = new Set[c];

	for(int i=0; i &lt; c; i++)
		m_member[i] = va_arg(vl, Set);

	va_end(vl);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1612726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612726</guid><dc:creator><![CDATA[usiko]]></dc:creator><pubDate>Mon, 10 Nov 2008 13:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 13:36:15 GMT]]></title><description><![CDATA[<p>Davon abgesehen das variable Parameterlisten kein gutes Design sind und eigentlich überall davon abgeraten wird: Warum nicht Pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612740</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 10 Nov 2008 13:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 13:51:25 GMT]]></title><description><![CDATA[<p>...und: Warum nicht Polymorphie ? Warum nicht vector ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612759</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 10 Nov 2008 13:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 17:03:36 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Davon abgesehen das variable Parameterlisten kein gutes Design sind und eigentlich überall davon abgeraten wird: Warum nicht Pointer?</p>
</blockquote>
<p>Versteh ich das richtig, Pointer auf Objekte wäre ok bzw (void <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>in diesem speziellen fall fänd ich variable parameterliste eine durchaus schöne lösung <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/1612861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612861</guid><dc:creator><![CDATA[usiko]]></dc:creator><pubDate>Mon, 10 Nov 2008 17:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 17:06:05 GMT]]></title><description><![CDATA[<p>va_args sind nicht schön, da sie nicht gut mit dem typsystem von C++ zusammenpassen; ein objekt (das nicht pod ist) so zu übergeben ist undefiniertes verhalten.</p>
<p>die C++ lösung wären wohl variadic templates, aber die gibt es noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612862</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 10 Nov 2008 17:06:05 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 19:06:54 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Warum nicht vector ?</p>
</blockquote>
<p>Würde ich auch meinen. Man kann auch mehrere Konstruktoren bereitstellen, die verschiedene Containertypen annehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612898</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 21:15:59 GMT]]></title><description><![CDATA[<p>Variante 1) Template ctor mit input-iterator-range:</p>
<pre><code class="language-cpp">class Collection
{
public:
    template &lt;class InputIterator&gt; Collection(InputIterator dataBegin, InputIterator dataEnd)
    {
        for (InputIterator it = dataBegin; it != dataEnd; ++it)
            Add(*it);
    }
};
</code></pre>
<p>Variante 2) Hilfs-Klasse:</p>
<pre><code class="language-cpp">class CollectionInitHelper
{
public:
    CollectionInitHelper();

    CollectionInitHelper operator &lt;&lt; (Foo* foo) const;
    // ...

private:
    CollectionInitHelper(CollectionInitHelper const* previous, Foo* foo);
};

class Collection ...
// ...

void Bar()
{
    Collection c(CollectionInitHelper() &lt;&lt; foo1 &lt;&lt; foo2 &lt;&lt; foo3 &lt;&lt; foo4);
}
</code></pre>
<p>Variante 2 kann man mit templates noch schöner hinbekommen so dass man nicht mit Zeigern o.ä. rumhantieren muss, die Länge nicht durchzählen etc. Ist aber vermutlich Overkill. Meist sollte Variante 1 reichen.</p>
<p>Variante 3: auf den neuen C++ Standard warten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612962</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 10 Nov 2008 21:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 21:24:37 GMT]]></title><description><![CDATA[<p>soweit ich mich erinnern kann ist in C++ die Ellipse mit Klassen nicht definiert oder erzeugt unspezifiziertes Verhalten (Sutter schrieb da in einem der Exceptional Bücher was)</p>
<p>Eventuell ist auch boost::assign::list_of() für deine Geschichte von interesse:<br />
<a href="http://www.boost.org/doc/libs/1_37_0/libs/assign/doc/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/libs/assign/doc/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612965</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 10 Nov 2008 21:24:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Mon, 10 Nov 2008 22:59:11 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Variante 3: auf den neuen C++ Standard warten.</p>
</blockquote>
<p>Variante 3b: Präprozessor-Magie:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;boost/preprocessor/repetition/repeat.hpp&gt;
#include &lt;boost/preprocessor/repetition/repeat_from_to.hpp&gt;
#include &lt;boost/preprocessor/repetition/enum_params.hpp&gt;

class Foo
{
  public:
    Foo(int n_) : n(n_) { }
    int n;
};

/*
 * Die eigentliche Funktion, mit Vector als Parameter
 */
void bar(std::vector&lt;Foo&gt; const &amp; args)
{
    for (std::vector&lt;Foo&gt;::const_iterator it = args.begin(); it != args.end(); ++it) {
        std::cout &lt;&lt; it-&gt;n &lt;&lt; std::endl;
    }
}

/*
 * Generiert Wrapper für bar() mit 1 bis 10 Parametern
 */
#define PP_PUSH_BACK(z, n, arg) args.push_back(arg ## n);
#define PP_BAR(z, n, data) \
    void bar(BOOST_PP_ENUM_PARAMS(n, Foo const &amp; f)) { \
        std::vector&lt;Foo&gt; args; \
        BOOST_PP_REPEAT_ ## z(n, PP_PUSH_BACK, f) \
        bar(args); \
    }
BOOST_PP_REPEAT_FROM_TO(1, 10, PP_BAR, ~)
#undef PP_PUSH_BACK
#undef PP_BAR

int main()
{
    // Aufruf mit Vector
    std::vector&lt;Foo&gt; v;
    v.push_back(Foo(4));
    v.push_back(Foo(8));
    v.push_back(Foo(15));
    bar(v);

    // Aufruf mit Einzelwerten
    bar(Foo(16), Foo(23), Foo(42));
}
</code></pre>
<p>Zugegeben, der Präprozessor-Code ist extrem kryptisch, aber den schreibt man ja auch nur einmal. <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="🙂"
    /><br />
Das Ganze lohnt sich natürlich erst dann, wenn man die Funktion an vielen verschiedenen Stellen aufruft, jeweils mit unterschiedlicher Parameter-Anzahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612982</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Mon, 10 Nov 2008 22:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste mit Objekten ? on Tue, 11 Nov 2008 08:08:42 GMT]]></title><description><![CDATA[<p>usiko schrieb:</p>
<blockquote>
<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Davon abgesehen das variable Parameterlisten kein gutes Design sind und eigentlich überall davon abgeraten wird: Warum nicht Pointer?</p>
</blockquote>
<p>Versteh ich das richtig, Pointer auf Objekte wäre ok bzw (void <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>in diesem speziellen fall fänd ich variable parameterliste eine durchaus schöne lösung <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>Ein Pointer ist ja (im Grunde) auch nur ein (unsigned) int und daher auch ein POD-Typ. Also kannst du in deiner variablen Parameterliste beliebige Pointer übergeben. Welche Typen die Pointer eigentlich haben musst du ja eh wissen, das ist ja der Ekel an Parameterlisten.</p>
<p>Aber wie schon reichlich erwähnt wurde hier: Mach es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613025</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 11 Nov 2008 08:08:42 GMT</pubDate></item></channel></rss>