<?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[Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC]]]></title><description><![CDATA[<p>Hallo miteinander</p>
<p>Ich experimentiere gerade an einer Art &quot;Marker-Template&quot; (nennen wir es hier vereinfacht nur <code>marker</code> ) herum. In etwa sieht das so aus:</p>
<pre><code>template&lt;typename&gt;
struct marker
{
    static const bool init;
};

template&lt;typename T&gt;
const bool marker&lt;T&gt;::init = ([]() -&gt; bool 
{
    clog &lt;&lt; &quot;Super Sache.&quot;;
    return true;
})();
</code></pre>
<p>Die Idee ist nun, dass man für irgend eine Erwähnung von <code>marker&lt;T&gt;</code> im Code (konkrete Anwendung ist auch in Vererbungshierarchien) vor Programmstart den im Lambda aufgeführten Code ausführen kann. Weil es sich bei <code>marker</code> um ein Template handelt funktioniert das leider nicht einfach, da auf die Variable init in der Regel nicht zugegriffen wird.</p>
<p>Nun bin ich auf der Suche nach einer möglichst portablen Lösung, um die Initialisierung zu forcieren. Unter GCC und LLVM habe ich z.B. folgende Möglichkeit gefunden:</p>
<pre><code>template&lt;typename static_type, static_type&gt;
struct require_static_initialization
{
};

// Angepasster Marker für GCC/LLVM:
template&lt;typename&gt;
struct marker
{
    static const bool init;
    typedef require_static_initialization&lt;decltype(init) *, &amp;init&gt; force_init;
};
</code></pre>
<p>Mit Visual C++ 2012 kompiliert es zwar problemlos, aber die Initialisierung findet nicht statt. Sieht jemand eine Möglichkeit, das trotzdem irgendwie zu ermöglichen?</p>
<p>Falls jemand eine Idee haben sollte, lasst es mich bitte wissen <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>Vielen Dank und schönes Wochenende noch!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319589/statische-initialisierung-in-template-forcieren-gcc-llvm-msvc</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 03:06:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319589.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Aug 2013 16:45:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Sat, 24 Aug 2013 16:45:58 GMT]]></title><description><![CDATA[<p>Hallo miteinander</p>
<p>Ich experimentiere gerade an einer Art &quot;Marker-Template&quot; (nennen wir es hier vereinfacht nur <code>marker</code> ) herum. In etwa sieht das so aus:</p>
<pre><code>template&lt;typename&gt;
struct marker
{
    static const bool init;
};

template&lt;typename T&gt;
const bool marker&lt;T&gt;::init = ([]() -&gt; bool 
{
    clog &lt;&lt; &quot;Super Sache.&quot;;
    return true;
})();
</code></pre>
<p>Die Idee ist nun, dass man für irgend eine Erwähnung von <code>marker&lt;T&gt;</code> im Code (konkrete Anwendung ist auch in Vererbungshierarchien) vor Programmstart den im Lambda aufgeführten Code ausführen kann. Weil es sich bei <code>marker</code> um ein Template handelt funktioniert das leider nicht einfach, da auf die Variable init in der Regel nicht zugegriffen wird.</p>
<p>Nun bin ich auf der Suche nach einer möglichst portablen Lösung, um die Initialisierung zu forcieren. Unter GCC und LLVM habe ich z.B. folgende Möglichkeit gefunden:</p>
<pre><code>template&lt;typename static_type, static_type&gt;
struct require_static_initialization
{
};

// Angepasster Marker für GCC/LLVM:
template&lt;typename&gt;
struct marker
{
    static const bool init;
    typedef require_static_initialization&lt;decltype(init) *, &amp;init&gt; force_init;
};
</code></pre>
<p>Mit Visual C++ 2012 kompiliert es zwar problemlos, aber die Initialisierung findet nicht statt. Sieht jemand eine Möglichkeit, das trotzdem irgendwie zu ermöglichen?</p>
<p>Falls jemand eine Idee haben sollte, lasst es mich bitte wissen <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>Vielen Dank und schönes Wochenende noch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348326</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sat, 24 Aug 2013 16:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Sat, 24 Aug 2013 18:25:28 GMT]]></title><description><![CDATA[<p>Und wenn Du über ein Makro den Zugriff einfach erzwingst?</p>
<pre><code class="language-cpp">#define MARK(T) static bool someDummyNonCollidingNameFor##T##Marker = marker&lt;T&gt;::init;
</code></pre>
<p>Klappt halt nur, wenn die Art der Initialisierung erlaubt ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348341</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 24 Aug 2013 18:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Sat, 24 Aug 2013 21:54:46 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und wenn Du über ein Makro den Zugriff einfach erzwingst?</p>
<pre><code class="language-cpp">#define MARK(T) static bool someDummyNonCollidingNameFor##T##Marker = marker&lt;T&gt;::init;
</code></pre>
<p>Klappt halt nur, wenn die Art der Initialisierung erlaubt ist</p>
</blockquote>
<p>Leider geht das nicht, da ich wirklich nur solche Dinge habe wie <code>class foo : public marker&lt;foo&gt; {...};</code> und das muss dann schon reichen. Danke aber für die Idee trotzdem <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 habe inzwischen eine Variante gefunden, welche auch mit Visual C++ funktioniert mit privaten virtuellen Funktionen:</p>
<pre><code>template&lt;typename&gt;
struct marker : public virtual marker&lt;&gt;
{
    static const bool init;
private:
    virtual void req() const
    {
        (void)init;
    }
};

template&lt;typename T&gt;
const bool marker&lt;T&gt;::init = ([]() -&gt; bool 
{
    clog &lt;&lt; &quot;Super Sache.&quot;;
    return true;
})();
</code></pre>
<p>Dies in Kombination mit dem typedef für GCC/LLVM deckt die wichtigsten Compiler-Familien ab. Nicht schön, aber das muss es auch nicht sein <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>Danke und gute Nacht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348353</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sat, 24 Aug 2013 21:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Sun, 25 Aug 2013 11:05:53 GMT]]></title><description><![CDATA[<p>Was hältst du davon: <a href="http://ideone.com/aerqPY" rel="nofollow">http://ideone.com/aerqPY</a></p>
<p>Biste wenigstens die virtuellen Funktionen los.</p>
<p>Soweit ich das jetzt getestet habe, geht es so auch auf Clang und VS2013.</p>
<p>Nachteil: Eine Warnung über die ungenutzte Expression (zumindest beim Clang)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348385</guid><dc:creator><![CDATA[ohne virtual]]></dc:creator><pubDate>Sun, 25 Aug 2013 11:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Sun, 25 Aug 2013 14:48:41 GMT]]></title><description><![CDATA[<p>Das nicht-Verwerfen von Variablen oder Code erzwingt man mMn. am besten mit <code>__declspec</code> o.ä. Compiler-Extensions. -&gt; Ich würde mich in der Richtung mal umsehen. Ist vermutlich auch wie wesentlich &quot;stabilere&quot; Lösung -- so Rumgetrickse mit anderen Konstrukten kann mit einer neuen Compilerversion schnell nimmer funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348448</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 25 Aug 2013 14:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Tue, 27 Aug 2013 08:56:24 GMT]]></title><description><![CDATA[<p>ohne virtual schrieb:</p>
<blockquote>
<p>Was hältst du davon: <a href="http://ideone.com/aerqPY" rel="nofollow">http://ideone.com/aerqPY</a></p>
</blockquote>
<p>Das funktioniert sehr gut, bedingt aber leider, dass man explizit eine Instanz der Klasse erzeugt, und die Initialisierung erfolgt darüber hinaus erst genau dann, wenn der Konstruktor aufgerufen wird. Mit der virtuellen Funktion ist das nicht nötig.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Ich habe nach einer __declspec-Erweiterung gesucht, aber dort gibts nur noch so unnützes Zeugs (Altlasten von Windows 3.11) oder Sachen, die von C++11 abgedeckt werden. Oder hattest du eine bestimmte Erweiterung im Kopf? <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>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348777</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Tue, 27 Aug 2013 08:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Tue, 27 Aug 2013 10:55:24 GMT]]></title><description><![CDATA[<blockquote>
<p>und die Initialisierung erfolgt darüber hinaus erst genau dann, wenn der Konstruktor aufgerufen wird.</p>
</blockquote>
<p>Das stimmt interessanterweise nicht. Ich habe es Mal getestet und &quot;Hello World&quot;-Ausgabe vor die Konstruktion geschoben. Dennoch wird &quot;init done&quot; zuerst ausgegeben, sogar wenn man noch einen Scope zwischenschiebt.</p>
<p>Wann die Initialisierung erfolgt, wäre aber die Frage, macht der Standard da irgendwelche Zusicherungen? Und dann ist die nächste Frage, ob das Tag wirklich für Klassen wichtig ist, die niemals instanziiert werden? Gibt es die überhaupt und welchen Sinn haben die?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348795</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 27 Aug 2013 10:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Initialisierung in Template forcieren [GCC&#x2F;LLVM&#x2F;MSVC] on Tue, 27 Aug 2013 13:53:18 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<blockquote>
<p>und die Initialisierung erfolgt darüber hinaus erst genau dann, wenn der Konstruktor aufgerufen wird.</p>
</blockquote>
<p>Das stimmt interessanterweise nicht. Ich habe es Mal getestet und &quot;Hello World&quot;-Ausgabe vor die Konstruktion geschoben. Dennoch wird &quot;init done&quot; zuerst ausgegeben, sogar wenn man noch einen Scope zwischenschiebt.</p>
<p>Wann die Initialisierung erfolgt, wäre aber die Frage, macht der Standard da irgendwelche Zusicherungen? Und dann ist die nächste Frage, ob das Tag wirklich für Klassen wichtig ist, die niemals instanziiert werden? Gibt es die überhaupt und welchen Sinn haben die?</p>
</blockquote>
<p>Die Initialisierung erfolgt so, als ob die Variable an der der Stelle an der sie instantiiert wird, als gewöhnliche Variable definiert worden wäre. Es gelten dann die üblichen Regeln für die Initialisierung von Variablen mit statischer Lebensdauer (wobei ich aus dem Kopf nicht sagen kann, auf welche ÜE die Initialisierung bezogen ist - wahrscheinlich unspezifiziert, die meisten Compiler initialisieren sowieso alles vor main und das reicht meist</p>
<p>Die Stelle der Instantiierung des statischen Members ist die Stelle der Instantiierung der Templateklasse - vermittelt durch die zusätzlichen Konstrukte. Eine implizite Instantiierung einer statischen Memberveraiblen erfolgt, wenn sie in einem Kontext verwendet wird, in dem ihre Definition existieren muss. Die Anwendung des Adressoperators (in einem potentiell ausgewerteten Ausdruck) ist so ein Kontext.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348811</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 27 Aug 2013 13:53:18 GMT</pubDate></item></channel></rss>