<?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[Template: Methode als Templateparameter angeben]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jmd von euch wie ich bei meinem Template den Destruktor generalisieren kann?</p>
<p>Ich möchte COM Objekte in den ScopedPtr packen können, die im Destructor abgebaut werden - durch den Aufruf &quot;ptr-&gt;release() wie im Code dargestellt; gleichzeitig soll der Destruktor aber auch Objekte abbauen können, die beispielsweise ein &quot;delete&quot; benötigen.</p>
<p>Wie kann ein solcher zweiter Templateparameter aussehen?</p>
<pre><code>template &lt;typename T&gt;
class ScopedPtr
{
public:
	ScopedPtr(T* _ptr) : ptr(_ptr) {}

private:
	ScopedPtr() : ptr(nullptr) {}
	~ScopedPtr();

private:
	T* ptr = nullptr;
};

template &lt;typename T&gt;
ADelPtr&lt;T&gt;::~ADelPtr()
{
	if (ptr)
		ptr-&gt;release(); 
}
</code></pre>
<p>BTW: Das Template ist nicht vollständig, sondern auf das notwendigste reduziert.</p>
<p>VG<br />
Jens</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338878/template-methode-als-templateparameter-angeben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 01:15:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338878.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jul 2016 16:20:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 16:20:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jmd von euch wie ich bei meinem Template den Destruktor generalisieren kann?</p>
<p>Ich möchte COM Objekte in den ScopedPtr packen können, die im Destructor abgebaut werden - durch den Aufruf &quot;ptr-&gt;release() wie im Code dargestellt; gleichzeitig soll der Destruktor aber auch Objekte abbauen können, die beispielsweise ein &quot;delete&quot; benötigen.</p>
<p>Wie kann ein solcher zweiter Templateparameter aussehen?</p>
<pre><code>template &lt;typename T&gt;
class ScopedPtr
{
public:
	ScopedPtr(T* _ptr) : ptr(_ptr) {}

private:
	ScopedPtr() : ptr(nullptr) {}
	~ScopedPtr();

private:
	T* ptr = nullptr;
};

template &lt;typename T&gt;
ADelPtr&lt;T&gt;::~ADelPtr()
{
	if (ptr)
		ptr-&gt;release(); 
}
</code></pre>
<p>BTW: Das Template ist nicht vollständig, sondern auf das notwendigste reduziert.</p>
<p>VG<br />
Jens</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502697</guid><dc:creator><![CDATA[Jens Schildring]]></dc:creator><pubDate>Mon, 18 Jul 2016 16:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 16:32:14 GMT]]></title><description><![CDATA[<p>Wieso verwendest du nicht unique_ptr? Er hat für diesen Zweck den Deleter-Typen (oder per Default std::default_delete).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502699</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Mon, 18 Jul 2016 16:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 16:36:39 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Wieso verwendest du nicht unique_ptr? Er hat für diesen Zweck den Deleter-Typen (oder per Default std::default_delete).</p>
</blockquote>
<p>Das stimmt, dieser funktioniert aber nicht mit den COM Objekten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502700</guid><dc:creator><![CDATA[Jens Schildring]]></dc:creator><pubDate>Mon, 18 Jul 2016 16:36:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 16:52:45 GMT]]></title><description><![CDATA[<p>Warum sollte er nicht?<br />
Aus dem Kopf getippt, Fehler sind zur Übung. <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>
<pre><code>namespace detail {
    template&lt;typename T&gt;
    void release(T* ptr) {
        ptr-&gt;release();
    }
}

template&lt;typename T&gt;
using ReleasePtr = std::unique_ptr&lt;T, void(*)(T*)&gt;;

template&lt;typename T&gt;
ReleasePtr&lt;T&gt; makeReleasePtr(T* ptr) {
    return ReleasePtr(ptr, &amp;detail::release&lt;T&gt;);
}

ReleasePtr&lt;Foo&gt; ptr = makeReleasePtr(createFoo());
ptr-&gt;bar();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502701</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 18 Jul 2016 16:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 19:22:18 GMT]]></title><description><![CDATA[<p>Das verbraucht weniger Speicher und ist einfacher zu benutzen:</p>
<pre><code class="language-cpp">namespace detail
{
    struct ReleaseDeleter
    {
        template&lt;typename T&gt;
        void operator()(T* ptr) const
        {
            ptr-&gt;release();
        }
    };
}

template&lt;typename T&gt;
using ReleasePtr = std::unique_ptr&lt;T, detail::ReleaseDeleter&gt;;

template&lt;typename T&gt;
ReleasePtr&lt;T&gt; makeReleasePtr(T* ptr)
{
    return ReleasePtr(ptr);
}

ReleasePtr&lt;Foo&gt; ptr = makeReleasePtr(createFoo());
ptr-&gt;bar();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502716</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 18 Jul 2016 19:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Mon, 18 Jul 2016 20:08:11 GMT]]></title><description><![CDATA[<p>Weniger Speicher? Ich denke, der unique_ptr legt da ein Objekt deines Deleters per Default Konstruktor an, ein bisschen Speicherverschwendung hast du wohl immer. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2502724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502724</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 18 Jul 2016 20:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Tue, 19 Jul 2016 10:07:40 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Weniger Speicher? Ich denke, der unique_ptr legt da ein Objekt deines Deleters per Default Konstruktor an, ein bisschen Speicherverschwendung hast du wohl immer. <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>
</blockquote>
<p>Nein, das Objekt braucht durch Empty Base Optimization keinen zusätzlichen Platz.</p>
<p>Das ist übrigens einer der Gründe, warum <code>unique_ptr</code> einen Template-Parameter für den Deleter hat und nicht einfach einen Funktionszeiger benutzt. Der Default-Deleter mit <code>delete</code> ist auch ein <code>struct</code> , kein Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502725</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 19 Jul 2016 10:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Methode als Templateparameter angeben on Tue, 19 Jul 2016 09:44:09 GMT]]></title><description><![CDATA[<p>Noch ein Hinweis: Die C++-Bibliothek der Windows Runtime beinhaltet bereits einen Smart Pointer für COM-Objekte, der auch noch ein paar zusätzliche COM-spezfische Methoden kennt:</p>
<p><a href="https://msdn.microsoft.com/en-us/library/br244983.aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/br244983.aspx</a></p>
<p>Vielleicht hilft das weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502758</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 19 Jul 2016 09:44:09 GMT</pubDate></item></channel></rss>