<?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[static + template + singleton: Wie kann man des machen?]]></title><description><![CDATA[<p>Folgender Problem:<br />
Ich hab eine Klasse. Die soll eine Funktion haben, worüber sie eine statische Instanz von sich selbst zurück gibt. Diese Klasse soll man aber auch ableiten können und dann soll Basisklasse aber bei der Funktion einen Typ von der Abgeleiteten Klasse zurück geben:</p>
<pre><code class="language-cpp">template&lt;typename _Type&gt;
inline static foo* instance() { static std::auto_ptr&lt;foo&gt; _inst(new _Type); return _inst.get(); }
</code></pre>
<p>Das das so nicht geht ... ist klar <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="😉"
    /> Die Instanz ist nicht einmalig, was aber gegeben sein muss. Dann kommt noch hinzu, dass ich beim ersten Aufruf, d.h. wenn die static-Variable belegt wird, einen Parameter übergeben muss:</p>
<pre><code class="language-cpp">template&lt;typename _Type&gt;
inline static foo* instance(bar const&amp; param1) { static std::auto_ptr&lt;foo&gt; _inst(new _Type(param1)); return _inst.get(); }
</code></pre>
<p>Hat da jemand eine Idee wie man das realisieren könnte? <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/201332/static-template-singleton-wie-kann-man-des-machen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 19:42:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201332.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Dec 2007 12:26:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 12:26:00 GMT]]></title><description><![CDATA[<p>Folgender Problem:<br />
Ich hab eine Klasse. Die soll eine Funktion haben, worüber sie eine statische Instanz von sich selbst zurück gibt. Diese Klasse soll man aber auch ableiten können und dann soll Basisklasse aber bei der Funktion einen Typ von der Abgeleiteten Klasse zurück geben:</p>
<pre><code class="language-cpp">template&lt;typename _Type&gt;
inline static foo* instance() { static std::auto_ptr&lt;foo&gt; _inst(new _Type); return _inst.get(); }
</code></pre>
<p>Das das so nicht geht ... ist klar <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="😉"
    /> Die Instanz ist nicht einmalig, was aber gegeben sein muss. Dann kommt noch hinzu, dass ich beim ersten Aufruf, d.h. wenn die static-Variable belegt wird, einen Parameter übergeben muss:</p>
<pre><code class="language-cpp">template&lt;typename _Type&gt;
inline static foo* instance(bar const&amp; param1) { static std::auto_ptr&lt;foo&gt; _inst(new _Type(param1)); return _inst.get(); }
</code></pre>
<p>Hat da jemand eine Idee wie man das realisieren könnte? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1427198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427198</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 28 Dec 2007 12:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 13:38:32 GMT]]></title><description><![CDATA[<p>Was soll bei dir &quot;foo&quot; sein - die Singleton-Klasse?</p>
<p>Aber eigentlich hast du es schon fast richtig:</p>
<pre><code class="language-cpp">template&lt;typename Type&gt;
class Singleton
{
  static Type* instance() { static std::auto_ptr&lt;Type&gt; _inst(new Type); return _inst.get(); }
};
</code></pre>
<p>Die abgeleitete Klasse erzeugst du dann einfach so:</p>
<pre><code class="language-cpp">class Test : public Singleton&lt;Test&gt;
{
};
</code></pre>
<p>Und einen Parameter würde ich an dieser Stelle nicht übergeben, weil dann müßtest du den ja überall beim Zugriff angeben.<br />
Du solltest dann lieber im Default-Konstruktor der abgeleiteten Klasse auf einen Parameter zugreifen, den du halt z.B. als statischen Member bereitstellst.</p>
<pre><code class="language-cpp">class Test : public Singleton&lt;Test&gt;
{
  static int m_initparam;
public:
  static int SetInitParam(int param) { m_initparam = param; }

  Test()
  {
    // use m_initparam
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1427228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427228</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 28 Dec 2007 13:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 14:36:10 GMT]]></title><description><![CDATA[<p>Hmm ja das Problem ist jetzt aber, dass ich auch will, dass ich jetzt hingehen kann, nachdem ich einmal die FUnktion aufgerufen habe und der Typ gesetzt ist, ich die Funktion aufrufen kann (mit foo als Type) und der mir dennoch die richtige Instanz zurück gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427255</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 28 Dec 2007 14:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 15:06:03 GMT]]></title><description><![CDATA[<p>Hi (D)Evil,</p>
<p>ich bin mir nicht ganz sicher, was das soll. Wozu z.B. der Auto-Ptr? Wozu das Template (das sollte eher ein Klassen-Template, kein Funktionstemplate sein, oder)?</p>
<p>Das einzige Problem ist die Parameter-Initialisierung. Hierzu musst Du dann doch einen Auto-Ptr verwenden und delayed intialization verwenden, in Verbindung mit der Init-Funktion von Th.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427265</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 28 Dec 2007 15:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 17:10:16 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>ich fand das ganz interessant, deswegen habe ich mal was ausprobiert. Klappt eigentlich genauso, wie ich mir das dachte. Hast Du das so gemeint?</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;

template &lt;typename D&gt;
struct custom_singleton {
    static D* instance() {
        return m__instance.get();
    }

protected:
    custom_singleton() { }
    custom_singleton(custom_singleton const&amp;);
    custom_singleton&amp; operator =(custom_singleton const&amp;);

    static void init(D* inst) {
        m__instance = static_cast&lt; std::auto_ptr&lt;D&gt; &gt;(inst);
    }

private:
    static std::auto_ptr&lt;D&gt; m__instance;
};

template &lt;typename D&gt;
std::auto_ptr&lt;D&gt; custom_singleton&lt;D&gt;::m__instance;

struct derived : public custom_singleton&lt;derived&gt; {
    static void init(int var) {
        custom_singleton&lt;derived&gt;::init(new derived(var));
    }

    void print() const {
        std::cout &lt;&lt; &quot;derived.m_var: &quot; &lt;&lt; m_var &lt;&lt; std::endl;
    }

private:
    derived(int var) : m_var(var) { }

    int m_var;
};

int main() {
    derived::init(42);
    derived* d = derived::instance();
    std::cout &lt;&lt; &quot;Address of d: &quot; &lt;&lt; d &lt;&lt; std::endl;
    d-&gt;print();
}
</code></pre>
<p>Wobei ich eine Referenz als Rückgabewert schon besser fände als einen Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427308</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 28 Dec 2007 17:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 17:57:05 GMT]]></title><description><![CDATA[<p>Hmm ja das Problem ist jetzt aber, dass ich auch will, dass ich jetzt hingehen kann, nachdem ich einmal die Funktion aufgerufen habe und der Typ gesetzt ist, ich die Funktion aufrufen kann (<strong>mit foo als Type</strong>) und der mir dennoch die richtige Instanz zurück gibt. Aber stimmt so nicht, würd was anderes auskommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427331</guid><dc:creator><![CDATA[(D)Evil LOGGED OUT!]]></dc:creator><pubDate>Fri, 28 Dec 2007 17:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 18:03:31 GMT]]></title><description><![CDATA[<p>(D)Evil LOGGED OUT! schrieb:</p>
<blockquote>
<p>Hmm ja das Problem ist jetzt aber, dass ich auch will, dass ich jetzt hingehen kann, nachdem ich einmal die Funktion aufgerufen habe und der Typ gesetzt ist, ich die Funktion aufrufen kann (<strong>mit foo als Type</strong>) und der mir dennoch die richtige Instanz zurück gibt. Aber stimmt so nicht, würd was anderes auskommen.</p>
</blockquote>
<p>Hm, das verstehe ich jetzt nicht. Die Funktion ist ja jetzt gar kein Template mehr, Du kannst natürlich aber mehrere Klassen ableiten und das ganze z.B. auch für den Typ 'foo' tun:</p>
<pre><code class="language-cpp">struct foo : custom_singleton&lt;foo&gt; {
    using custom_singleton&lt;foo&gt;::init;
};

// …

foo::init(new foo());
foo::instance();
// Oder, genauso:
custom_singleton&lt;foo&gt;::instance();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1427335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427335</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 28 Dec 2007 18:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to static + template + singleton: Wie kann man des machen? on Fri, 28 Dec 2007 19:16:36 GMT]]></title><description><![CDATA[<p>Hmm war ja auch jemand anders, der das geschrieben hat. Hab im Moment noch keine Zeit es zu testen, aber schon einmal vielen dank Konrad!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427370</guid><dc:creator><![CDATA[(D)Evil_loggedoff]]></dc:creator><pubDate>Fri, 28 Dec 2007 19:16:36 GMT</pubDate></item></channel></rss>