<?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[MPL-Placeholder-Frage]]></title><description><![CDATA[<p>Tag,</p>
<p>ich versuche hier, die Größen von float-Arrays in einer MPL-Sequenz zusammenzuzählen, also zB:</p>
<pre><code class="language-cpp">typedef std::tr1::array &lt; float, 2 &gt; vector2_t;
typedef std::tr1::array &lt; float, 3 &gt; vector3_t;
typedef boost::mpl::vector &lt; vector3_t, vector2_t &gt; sequence_;
enum
{
  size = sizeof(float) * 3 + sizeof(float) * 2
};
</code></pre>
<p>Das soll halt automatisch gehen. Ich bin bisher auf diese Lösung gekommen:</p>
<pre><code class="language-cpp">namespace detail
{

template &lt; typename &gt; struct calc_attrib_size;

template &lt; typename T, unsigned int N &gt;
struct calc_attrib_size &lt; std::tr1::array &lt; T, N &gt; &gt;
{
	enum
	{
		value = sizeof(T) * N
	};
};

}

typedef std::tr1::array &lt; float, 2 &gt; vector2_t;
typedef std::tr1::array &lt; float, 3 &gt; vector3_t;
typedef boost::mpl::vector &lt; vector3_t, vector2_t &gt; sequence_t;

typedef typename boost::mpl::fold &lt;
		sequence_t,
		boost::mpl::int_ &lt; 0 &gt;,
		boost::mpl::plus &lt;
			boost::mpl::int_ &lt;
				detail::calc_attrib_size &lt;
					boost::mpl::placeholders::_2 // error
				&gt; ::value
			&gt;,
			boost::mpl::placeholders::_1
		&gt;
	&gt; ::type vertex_size_t;

enum
{
	vertex_size = vertex_size_t::value
};
</code></pre>
<p>Das klappt wunderbar, wenn ich boost::mpl::placeholders::_2 durch zB std::tr1::array &lt; float, 3 &gt; ersetze, d.h. der Placeholder wird nicht richtig aufgelöst, da er incomplete ist an der Stelle. Lösungsvorschläge?</p>
<p>Btw. ein einfaches sizeof_ &lt; boost::mpl::placeholders::_2 &gt; hatte ich vorher, aber es stellt sich heraus, dass sizeof(std::tr1::array &lt; float, 3 &gt;) <strong>!=</strong> sizeof(float) * 3. Stattdessen ists 16 Byte groß, ich nehm mal an aus Alignment-Gründen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/223359/mpl-placeholder-frage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 21:19:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/223359.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Sep 2008 09:25:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MPL-Placeholder-Frage on Thu, 25 Sep 2008 09:25:22 GMT]]></title><description><![CDATA[<p>Tag,</p>
<p>ich versuche hier, die Größen von float-Arrays in einer MPL-Sequenz zusammenzuzählen, also zB:</p>
<pre><code class="language-cpp">typedef std::tr1::array &lt; float, 2 &gt; vector2_t;
typedef std::tr1::array &lt; float, 3 &gt; vector3_t;
typedef boost::mpl::vector &lt; vector3_t, vector2_t &gt; sequence_;
enum
{
  size = sizeof(float) * 3 + sizeof(float) * 2
};
</code></pre>
<p>Das soll halt automatisch gehen. Ich bin bisher auf diese Lösung gekommen:</p>
<pre><code class="language-cpp">namespace detail
{

template &lt; typename &gt; struct calc_attrib_size;

template &lt; typename T, unsigned int N &gt;
struct calc_attrib_size &lt; std::tr1::array &lt; T, N &gt; &gt;
{
	enum
	{
		value = sizeof(T) * N
	};
};

}

typedef std::tr1::array &lt; float, 2 &gt; vector2_t;
typedef std::tr1::array &lt; float, 3 &gt; vector3_t;
typedef boost::mpl::vector &lt; vector3_t, vector2_t &gt; sequence_t;

typedef typename boost::mpl::fold &lt;
		sequence_t,
		boost::mpl::int_ &lt; 0 &gt;,
		boost::mpl::plus &lt;
			boost::mpl::int_ &lt;
				detail::calc_attrib_size &lt;
					boost::mpl::placeholders::_2 // error
				&gt; ::value
			&gt;,
			boost::mpl::placeholders::_1
		&gt;
	&gt; ::type vertex_size_t;

enum
{
	vertex_size = vertex_size_t::value
};
</code></pre>
<p>Das klappt wunderbar, wenn ich boost::mpl::placeholders::_2 durch zB std::tr1::array &lt; float, 3 &gt; ersetze, d.h. der Placeholder wird nicht richtig aufgelöst, da er incomplete ist an der Stelle. Lösungsvorschläge?</p>
<p>Btw. ein einfaches sizeof_ &lt; boost::mpl::placeholders::_2 &gt; hatte ich vorher, aber es stellt sich heraus, dass sizeof(std::tr1::array &lt; float, 3 &gt;) <strong>!=</strong> sizeof(float) * 3. Stattdessen ists 16 Byte groß, ich nehm mal an aus Alignment-Gründen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587762</guid><dc:creator><![CDATA[dv_]]></dc:creator><pubDate>Thu, 25 Sep 2008 09:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to MPL-Placeholder-Frage on Thu, 25 Sep 2008 09:43:25 GMT]]></title><description><![CDATA[<p>Ich kenne mich selber nicht so gut aus in der MPL, aber ich denke hiermit sollte dir geholfen sein:<br />
<a href="http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/tutorial/handling-placeholders.html" rel="nofollow">http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/tutorial/handling-placeholders.html</a></p>
<p>Dein Problem ist ja, dass dein <code>struct calc_attrib_size</code> nicht mit Placeholders umgehen kann. Im Link und den weiterführenden Links steht, wie man dies erreichen kann. Wie das genau auf dein <code>struct</code> anzuwenden ist, will ich mir jetzt nicht überlegen <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>Hoffe aber du kommst damit weiter.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587771</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 25 Sep 2008 09:43:25 GMT</pubDate></item><item><title><![CDATA[Reply to MPL-Placeholder-Frage on Thu, 25 Sep 2008 09:50:38 GMT]]></title><description><![CDATA[<p>Ja, die Lösung war tatsächlich einfach.</p>
<p>calc_attrib_size damit ersetzen:</p>
<pre><code class="language-cpp">template &lt; typename &gt; struct calc_attrib_size;

template &lt; typename T, unsigned int N &gt;
struct calc_attrib_size &lt; std::tr1::array &lt; T, N &gt; &gt; : public boost::mpl::integral_c &lt; unsigned int, sizeof(T) * N &gt;
{
};
</code></pre>
<p>Und den MPL-Code damit ersetzen:</p>
<pre><code class="language-cpp">typedef typename boost::mpl::fold &lt;
			sequence_t,
			boost::mpl::int_ &lt; 0 &gt;,
			boost::mpl::plus &lt;
				detail::calc_attrib_size &lt; boost::mpl::placeholders::_2 &gt;,
				boost::mpl::placeholders::_1
			&gt;
		&gt; ::type vertex_size_t;
</code></pre>
<p>Hierbei besonders auf mpl::plus achten - ist einfacher als der vorherige Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1587775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1587775</guid><dc:creator><![CDATA[dv_]]></dc:creator><pubDate>Thu, 25 Sep 2008 09:50:38 GMT</pubDate></item></channel></rss>