<?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[initalizer_list::size nicht constexpr]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade zur Übung eine Klasse für einen Punkt, die u.a. die Dimension als Templateparameter erhält.<br />
Ich will zusätzlich einen Konstruktor anbieten, die die Initialisierung der Komponenten des Punktes über eine initializer_list ermöglicht; dabei soll mit einer static_assert überprüft werden, ob die Größe der Liste mit der Dimension übereinstimmt.<br />
Leider ist initializer_list::size keine constexpr und kann daher nicht in static_assert verwendet werden. Was ist der Sinn dahinter, und gibt es einen Workaround?</p>
<pre><code>template &lt;typename T, int dim = 2&gt;
class Point
{
   public:
      Point(T x, T y):
         p {x, y}
      {
         static_assert(dim == 2, &quot;Dimension / Parameter count mismatch&quot;);
      }

      Point(T x, T y, T z):
         p {x, y, z}
      {
         static_assert(dim == 3, &quot;Dimension / Parameter count mismatch&quot;);
      }

      Point(std::initializer_list&lt;T&gt; l)
      {
         static_assert(l.size() == dim, &quot;Dimension / Parameter count mismatch&quot;);
//         auto it = l.begin();
//         for (int i=0; i&lt;l.size() &amp;&amp; i&lt;dim; ++i) {
//            p[i] = *it++;
//         }
      }

   private:
      T p[dim];
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/319580/initalizer_list-size-nicht-constexpr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 04:10:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319580.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Aug 2013 09:30:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:30:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade zur Übung eine Klasse für einen Punkt, die u.a. die Dimension als Templateparameter erhält.<br />
Ich will zusätzlich einen Konstruktor anbieten, die die Initialisierung der Komponenten des Punktes über eine initializer_list ermöglicht; dabei soll mit einer static_assert überprüft werden, ob die Größe der Liste mit der Dimension übereinstimmt.<br />
Leider ist initializer_list::size keine constexpr und kann daher nicht in static_assert verwendet werden. Was ist der Sinn dahinter, und gibt es einen Workaround?</p>
<pre><code>template &lt;typename T, int dim = 2&gt;
class Point
{
   public:
      Point(T x, T y):
         p {x, y}
      {
         static_assert(dim == 2, &quot;Dimension / Parameter count mismatch&quot;);
      }

      Point(T x, T y, T z):
         p {x, y, z}
      {
         static_assert(dim == 3, &quot;Dimension / Parameter count mismatch&quot;);
      }

      Point(std::initializer_list&lt;T&gt; l)
      {
         static_assert(l.size() == dim, &quot;Dimension / Parameter count mismatch&quot;);
//         auto it = l.begin();
//         for (int i=0; i&lt;l.size() &amp;&amp; i&lt;dim; ++i) {
//            p[i] = *it++;
//         }
      }

   private:
      T p[dim];
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2348255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348255</guid><dc:creator><![CDATA[mortified_penguin]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:39:22 GMT]]></title><description><![CDATA[<p>mortified_penguin schrieb:</p>
<blockquote>
<p>Was ist der Sinn dahinter</p>
</blockquote>
<p>Den Sinn versteht niemand, der Grund ist, dass initializer_list der allerletze Schrott ist.</p>
<p>Ungetestet:</p>
<pre><code class="language-cpp">tempalte &lt;typename... T&gt;
      Point(T&amp;&amp;... is)
        p{is...}
      {
         static_assert(sizeof...(is) == dim, &quot;Dimension / Parameter count mismatch&quot;);
      }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2348258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348258</guid><dc:creator><![CDATA[initialschaden]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:42:21 GMT]]></title><description><![CDATA[<p>Du könntest Variadic templates nutzen und würdest dabei auch die drei anderen Konstruktoren sparen.</p>
<p>Außerdem würde sich hier statt T p[dim] std::array&lt;T, dim&gt; anbieten, weil es automatisch kopiert und gemoved (scheiß wort) werden kann, ohne dass man im Compiler das selber machen muss.</p>
<p>EDIT: Zu spät</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348259</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:44:17 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>Außerdem würde sich hier statt T p[dim] std::array&lt;T, dim&gt; anbieten, weil es automatisch kopiert und gemoved (scheiß wort) werden kann, ohne dass man im <strong>Compiler</strong> das selber machen muss.</p>
</blockquote>
<p>Zu dumm, dass hier auch normale Arrays automatisch kopiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348261</guid><dc:creator><![CDATA[herr compiler]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:52:55 GMT]]></title><description><![CDATA[<p>herr compiler schrieb:</p>
<blockquote>
<p>Marthog schrieb:</p>
<blockquote>
<p>Außerdem würde sich hier statt T p[dim] std::array&lt;T, dim&gt; anbieten, weil es automatisch kopiert und gemoved (scheiß wort) werden kann, ohne dass man im <strong>Compiler</strong> das selber machen muss.</p>
</blockquote>
<p>Zu dumm, dass hier auch normale Arrays automatisch kopiert werden.</p>
</blockquote>
<p>Default copy-constructor kopiert unter anderem POD types. Wie konnte ich das nur vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348263</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 09:58:23 GMT]]></title><description><![CDATA[<blockquote>
<p>initializer_list::size keine constexpr und kann daher nicht in static_assert verwendet werden</p>
</blockquote>
<p>Weil es den Compilerherstellern ueberlassen ist, wie sie das implementieren. Es koennte auch ein std::vector in anderen Kleidern sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348264</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sat, 24 Aug 2013 09:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 10:07:57 GMT]]></title><description><![CDATA[<p>Das mit den variadic templates ist eine gute Idee, funktioniert auch. Brauche ich halt eine rekursive Hilfsfunktion, bisschen unschön aber ok.</p>
<p>Dennoch finde ich es schwachsinnig, dass size keine constexpr ist. Nach der Definition kann ich ja so oder so keine Werte zu der Liste hinzufügen bzw. wegnehmen. Aber ich bin auch kein Experte :D.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348266</guid><dc:creator><![CDATA[mortified_penguin]]></dc:creator><pubDate>Sat, 24 Aug 2013 10:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Sat, 24 Aug 2013 10:38:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich will zusätzlich einen Konstruktor anbieten, die die Initialisierung der Komponenten des Punktes über eine initializer_list ermöglicht</p>
</blockquote>
<p>Das macht keinen Sinn. Ein <code>initializer_list</code> -Konstruktor ist da sinnvoll, wo eine verschiedene Anzahl von Argumenten möglich ist (bspw. <code>vector</code> ).<br />
Deine Punkt-Klasse kann auch so dank <em>list-initialization</em> mit der entsprechenden Syntax initialisiert werden, dazu brauchst du keinen <code>initializer_list</code> -Konstruktor. Und <em>variadic templates</em> schon gar nicht, das ist noch unpassender.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348271</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 24 Aug 2013 10:38:09 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Mon, 26 Aug 2013 14:28:52 GMT]]></title><description><![CDATA[<p>Nur der Vollständigkeit halber:<br />
Man kann die betreffende Parameterliste auch vorher erzeugen, nachteilig sind ggf. die schlechteren Fehlermeldungen. Andererseits wird der Code etwas einfacher, weil weniger Membertemplates benötigt werden. Lohnt nat. nur, wenn die Liste öfter gebraucht wird.</p>
<pre><code class="language-cpp">template &lt;typename... T&gt; struct type_list;
template &lt;int N, typename T, typename = type_list&lt;&gt;&gt; struct repeat;
template &lt;int N, typename T, typename... elems&gt; struct repeat&lt;N, T, type_list&lt;elems...&gt;&gt;
    : repeat&lt;N-1, T, type_list&lt;T, elems...&gt;&gt; {};
template &lt;typename T, typename... elems&gt; struct repeat&lt;0, T,
type_list&lt;elems...&gt;&gt;
{
    typedef type_list&lt;elems...&gt; type;
};

template &lt;typename T, int dim = 2, typename = typename repeat&lt;dim, T&gt;::type&gt;
class Point;
template &lt;typename T, int dim, typename... elems&gt;
class Point&lt;T, dim, type_list&lt;elems...&gt;&gt;
{
   public:
      Point(elems... v):
         p {v...}
      {}

   private:
      T p[dim];
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2348615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348615</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 26 Aug 2013 14:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Mon, 26 Aug 2013 15:08:00 GMT]]></title><description><![CDATA[<p>Danke für die Vorschläge und Workarounds.</p>
<p>Ich hab mal im C++14 draft geschaut, dort sind begin(), end() und size() als constexpr deklariert. (18.9.2).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348628</guid><dc:creator><![CDATA[mortified_penguin]]></dc:creator><pubDate>Mon, 26 Aug 2013 15:08:00 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Mon, 26 Aug 2013 15:47:29 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Das macht keinen Sinn. Ein <code>initializer_list</code> -Konstruktor ist da sinnvoll, wo eine verschiedene Anzahl von Argumenten möglich ist (bspw. <code>vector</code> ).</p>
</blockquote>
<p>Ist doch in der Point-Klasse auch der Fall. Oder allgemein einem mathematischen Vektor.</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Deine Punkt-Klasse kann auch so dank <em>list-initialization</em> mit der entsprechenden Syntax initialisiert werden</p>
</blockquote>
<p>Und wie sieht die Syntax aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348648</guid><dc:creator><![CDATA[Freddy Kruger]]></dc:creator><pubDate>Mon, 26 Aug 2013 15:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to initalizer_list::size nicht constexpr on Mon, 26 Aug 2013 17:30:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist doch in der Point-Klasse auch der Fall.</p>
</blockquote>
<p>Nein. In der Point-Klasse, sprich: Einer Spezialisierung des Klassentemplates, ist die Zahl immer fest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348679</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 26 Aug 2013 17:30:39 GMT</pubDate></item></channel></rss>