<?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[Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Reihe Klassen, welche dynamisch mittels Placement-new<br />
erzeugt werden sollen (Embedded System).</p>
<p>Das Problem ist die Ermittlung des nötigen Speichers.<br />
Am einfachsten wäre sowas in der Art</p>
<pre><code class="language-cpp">const unsigned long bufferSize = 100;
char buffer[bufferSize];
</code></pre>
<p>Ist aber nicht gerade elegant da die nötige maximale Größe<br />
bei jeder Änderung von Hand angepasst oder zumindest überprüft<br />
werden muss.</p>
<p>Lieber wäre mir eine automatische Ermittlung.<br />
Bei zwei Klassen geht ja noch sowas:</p>
<pre><code class="language-cpp">const unsigned long bufferSize = sizeof(C1) &gt; sizeof(C2) ? sizeof(C1) : sizeof(C2);
</code></pre>
<p>Aber schon bei dreien artet das ziemlich aus.</p>
<p>Mögliche Lösung über Templates:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2&gt;
class Size
{
public:
	static const unsigned long maximum = sizeof(T1) &gt; T2::maximum ? sizeof(T1) : T2::maximum;
};

template &lt;class T&gt;
class Size&lt;T, char&gt;
{
public:
	static const unsigned long maximum = sizeof(T);
};

unsigned long bufferSize = Size&lt;
	C1, Size&lt;
	C2, Size&lt;
	C3, char // &lt;-- das char hier ist häßlich
	&gt; &gt; &gt;::maximum;
</code></pre>
<p>Geht das nicht noch irgendwie eleganter, so dass das &quot;char&quot;<br />
nicht mit angegeben werden muss?</p>
<p>Was mir noch einfallen würde, ist eine neue Klasse SingleSize<br />
zu implementieren und diese für den innersten Eintrag zu verwenden:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class SingleSize
{
public:
	static const unsigned long maximum = sizeof(T);
};

	unsigned long bufferSize2 = Size&lt;
		d1, Size&lt;
		d2, SingleSize&lt;
		d3&gt; &gt; &gt;::maximum;
</code></pre>
<p>Ist aber auch ned so wirklich schön. Hätte gern<br />
nur &quot;Size&quot; drin stehen, beim innersten Eintrag halt<br />
mit nur einem Argument...</p>
<p>Ist jetzt nicht so wirklich dringend, weil obige Lösungen zu<br />
funktionieren scheinen, aber irgendwie wurmts mich doch, dass<br />
ich's ned schöner hinbekomm...</p>
<p>Gruss,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272216/größte-klasse-zur-compilezeit-mit-templates-finden-geht-das-auch-schöner</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 01:03:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272216.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Aug 2010 19:06:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:06:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Reihe Klassen, welche dynamisch mittels Placement-new<br />
erzeugt werden sollen (Embedded System).</p>
<p>Das Problem ist die Ermittlung des nötigen Speichers.<br />
Am einfachsten wäre sowas in der Art</p>
<pre><code class="language-cpp">const unsigned long bufferSize = 100;
char buffer[bufferSize];
</code></pre>
<p>Ist aber nicht gerade elegant da die nötige maximale Größe<br />
bei jeder Änderung von Hand angepasst oder zumindest überprüft<br />
werden muss.</p>
<p>Lieber wäre mir eine automatische Ermittlung.<br />
Bei zwei Klassen geht ja noch sowas:</p>
<pre><code class="language-cpp">const unsigned long bufferSize = sizeof(C1) &gt; sizeof(C2) ? sizeof(C1) : sizeof(C2);
</code></pre>
<p>Aber schon bei dreien artet das ziemlich aus.</p>
<p>Mögliche Lösung über Templates:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2&gt;
class Size
{
public:
	static const unsigned long maximum = sizeof(T1) &gt; T2::maximum ? sizeof(T1) : T2::maximum;
};

template &lt;class T&gt;
class Size&lt;T, char&gt;
{
public:
	static const unsigned long maximum = sizeof(T);
};

unsigned long bufferSize = Size&lt;
	C1, Size&lt;
	C2, Size&lt;
	C3, char // &lt;-- das char hier ist häßlich
	&gt; &gt; &gt;::maximum;
</code></pre>
<p>Geht das nicht noch irgendwie eleganter, so dass das &quot;char&quot;<br />
nicht mit angegeben werden muss?</p>
<p>Was mir noch einfallen würde, ist eine neue Klasse SingleSize<br />
zu implementieren und diese für den innersten Eintrag zu verwenden:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class SingleSize
{
public:
	static const unsigned long maximum = sizeof(T);
};

	unsigned long bufferSize2 = Size&lt;
		d1, Size&lt;
		d2, SingleSize&lt;
		d3&gt; &gt; &gt;::maximum;
</code></pre>
<p>Ist aber auch ned so wirklich schön. Hätte gern<br />
nur &quot;Size&quot; drin stehen, beim innersten Eintrag halt<br />
mit nur einem Argument...</p>
<p>Ist jetzt nicht so wirklich dringend, weil obige Lösungen zu<br />
funktionieren scheinen, aber irgendwie wurmts mich doch, dass<br />
ich's ned schöner hinbekomm...</p>
<p>Gruss,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939364</guid><dc:creator><![CDATA[123abc789]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:14:49 GMT]]></title><description><![CDATA[<p>Edit: sry, falsch gelesen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939366</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:19:31 GMT]]></title><description><![CDATA[<p>So jetzt:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2 = char&gt;
class Size
{
public:
    static const unsigned long maximum = sizeof(T1) &gt; T2::maximum ? sizeof(T1) : T2::maximum;
};

template &lt;class T&gt;
class Size&lt;T, char&gt;
{
public:
    static const unsigned long maximum = sizeof(T);
};
</code></pre>
<p>(man beachte das Default-Argument)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939368</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:33:07 GMT]]></title><description><![CDATA[<p>Du kannst die dafür ein eigenes struct erzeugen, was das ende der liste markiert. ZB so:</p>
<pre><code class="language-cpp">struct emptylist {};
</code></pre>
<p>und das statt <code>char</code> verwenden. Die Idee mit dem Default-Argument ist auch nicht schlecht. Also, emptylist könnte das Default-Argument des zweiten Template-Parameters sein.</p>
<p>Sonst, könnte man das mit C++0x und variadischen Templates noch umgehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;type_traits&gt; // std::integral_constant, std::conditional

template&lt;class...Types&gt;
struct max_size : std::integral_constant&lt;std::size_t,0&gt; {};

template&lt;class T&gt;
struct max_size&lt;T&gt; : std::integral_constant&lt;std::size_t,sizeof(T)&gt; {};

template&lt;class T, class U, class...Rest&gt;
struct max_size&lt;T,U,Rest...&gt; : std::conditional&lt;
  ( sizeof(T) &gt; sizeof(U) ),
  max_size&lt;T,Rest...&gt;,
  max_size&lt;U,Rest...&gt;
&gt;::type {};

int main() {
  std::cout &lt;&lt; max_size&lt;char,int,double,float&gt;::value &lt;&lt; std::endl;
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939377</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:44:03 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>So jetzt:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2 = char&gt;
class Size
{
public:
    static const unsigned long maximum = sizeof(T1) &gt; T2::maximum ? sizeof(T1) : T2::maximum;
};

template &lt;class T&gt;
class Size&lt;T, char&gt;
{
public:
    static const unsigned long maximum = sizeof(T);
};
</code></pre>
<p>(man beachte das Default-Argument)</p>
</blockquote>
<p>Hübsch, hübsch<br />
besten Dank</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:<br />
Ich bin schon froh, dass ich überhaupt C++ verwenden kann. C++0x liegt da<br />
in zu weiter Zukunft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939381</guid><dc:creator><![CDATA[123abc789]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:44:03 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 19:50:34 GMT]]></title><description><![CDATA[<p>Sorry, hab den Strichpunkt hinter dem Struct vergessen gehabt.<br />
Etz läufts auch mit dem empty struct.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939385</guid><dc:creator><![CDATA[123abc789]]></dc:creator><pubDate>Thu, 12 Aug 2010 19:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 20:39:37 GMT]]></title><description><![CDATA[<p>Boost.MPL hat sowas:</p>
<pre><code class="language-cpp">#include &lt;boost/mpl/max_element.hpp&gt;
#include &lt;boost/mpl/sizeof.hpp&gt;
#include &lt;boost/mpl/transform_view.hpp&gt;
#include &lt;boost/mpl/vector.hpp&gt;

#include &lt;cstddef&gt;
#include &lt;iostream&gt;

int main() {
  using namespace boost::mpl;

  std::size_t n
    = sizeof(deref&lt;max_element&lt;transform_view&lt;vector&lt;int, char, double&gt;,
                                              sizeof_&lt;_1&gt; &gt; &gt;::type::base&gt;::type);

  std::cout &lt;&lt; n &lt;&lt; std::endl;
}
</code></pre>
<p>bzw.</p>
<pre><code class="language-cpp">typedef vector&lt;int, char, double&gt; types;
  typedef max_element&lt;transform_view&lt;types, sizeof_&lt;_1&gt; &gt; &gt;::type iter;

  std::size_t n = sizeof(deref&lt;iter::base&gt;::type);
</code></pre>
<p>Das lässt sich dann wunderbar in boost::aligned_storage o.ä. stopfen. Wenn du zwischen mehr als 20 Typen wählen willst, musst du BOOST_MPL_LIMIT_VECTOR_SIZE vor den #includes entsprechend höher definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939407</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 12 Aug 2010 20:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 20:59:09 GMT]]></title><description><![CDATA[<p>Hallo <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>Ich hab dieses Problem schon mal mit unions gelöst...</p>
<pre><code class="language-cpp">typedef char NullType;

template&lt;class C1, class C2 = NullType, class C3 = NullType, class C4 = NullType, class C5 = NullType, class C6 = NullType&gt;
struct MaxClassSize
{
  union
  {
    C1	c1;
    C2	c2;
    C3	c3;
    C4	c4;
    C5	c5;
    C6	c6;
  };
};
</code></pre>
<p>sizeof(MaxClassSize&lt;A, B, C&gt;) sollte damit die größte Größe zurückliefern ... ist aber zugegeben etwas veraltet.</p>
<p>Ich hab mir das nun nochmals durch den Kopf gehen lassen und bin auf eine andere Verknüpfung gekommen, die zumindest mein VC durchgelassen hat. Gebe aber keine Garantien ab <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>
<pre><code class="language-cpp">template&lt;class C1, class C2, bool FIRST&gt; struct SelectType;
template&lt;class C1, class C2&gt; struct SelectType&lt;C1, C2, true&gt; { typedef C1 Type; };
template&lt;class C1, class C2&gt; struct SelectType&lt;C1, C2, false&gt; { typedef C2 Type; };

template&lt;class C1, class C2&gt; struct IsGreaterType
{
  static const bool Value = sizeof(C1) &gt; sizeof(C2);
};

template&lt;class T&gt;
struct GetMaxTypeOf
{
  typedef T Type;
  typedef GetMaxTypeOf&lt;T&gt; And;

  template&lt;class T2&gt; struct Of
  {
    typedef typename SelectType&lt;T, T2, IsGreaterType&lt;T, T2&gt;::Value &gt;::Type Type;
    typedef GetMaxTypeOf&lt;Type&gt; And;
  };
};
</code></pre>
<p>ist dann etwas länger zu schreiben, aber vielleicht etwas lesbarer.</p>
<pre><code class="language-cpp">sizeof(GetMaxTypeOf&lt;int&gt;::And::Of&lt;float&gt;::And::Of&lt;char&gt;::And::Of&lt;double&gt;::Type)
</code></pre>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939416</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Thu, 12 Aug 2010 20:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 22:09:28 GMT]]></title><description><![CDATA[<p>geht das nicht mit nem union viel einfacher?<br />
das template musst du halt dann x-mal überladen - da lässt sich aber vll was mit boost preprocessor machen...</p>
<p>bb</p>
<p>edit: klasse - 2h lang nen tab nicht aktualisiert - sry^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939448</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 12 Aug 2010 22:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 22:23:02 GMT]]></title><description><![CDATA[<p>Du kriegst nur POD-Typen in eine Union gequetscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939453</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 12 Aug 2010 22:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 23:18:42 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Du kriegst nur POD-Typen in eine Union gequetscht.</p>
</blockquote>
<p>wo steht das? oO<br />
ich glaube nicht, dass das stimmt...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939462</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 12 Aug 2010 23:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 23:27:23 GMT]]></title><description><![CDATA[<p>Oh, stimmt @seldon</p>
<pre><code class="language-cpp">template&lt;class C1, class C2 = NullType, class C3 = NullType, class C4 = NullType, class C5 = NullType, class C6 = NullType&gt;
struct MaxClassSize
{
  union
  {
    char c1[sizeof(C1)];
    char c2[sizeof(C2)];
    char c3[sizeof(C3)];
    char c4[sizeof(C4)];
    char c5[sizeof(C5)];
    char c6[sizeof(C6)];
  };
};
</code></pre>
<p>Mir fällt aber dabei wieder mein Alignment-Problem ein, und deshalb wird einem die union-Methode nicht wirklich viel bringen. Man brauch für das char-Array auf jeden Fall das größte Alignment aller Typen ... Also kommt man an den echten Typen wohl nicht herum :p</p>
<p>Ok ... union funkioniert nicht sicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939465</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Thu, 12 Aug 2010 23:27:23 GMT</pubDate></item><item><title><![CDATA[Reply to Größte Klasse zur Compilezeit mit Templates finden (geht das auch schöner?) on Thu, 12 Aug 2010 23:41:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>:</p>
<p>ISO/IEC 14882:2003 9.5 (1) schrieb:</p>
<blockquote>
<p>An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.</p>
</blockquote>
<p>xors Workaround funktioniert insofern, als dass der größte Typ in der Aufzählung auf jeden Fall in die union passt. Für viele Use-Cases dürfte das völlig ausreichend, obwohl ich mir jetzt nicht sicher bin, ob dabei Speicher verschwendet würde. Trotzdem gefällt mir die GetMaxTypeOf-Idee besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1939468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1939468</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 12 Aug 2010 23:41:24 GMT</pubDate></item></channel></rss>